C++指针精髓(经典必看)
- 格式:pdf
- 大小:244.33 KB
- 文档页数:30
C语言指针的长度和类型详解C语言指针的长度和类型详解指针是C语言的精髓,以下是店铺搜索整理的关于C语言指针的长度和类型详解,对于初学者深入理解C语言程序设计有很好的参考价值,有需要的朋友可以参考一下!想了解更多相关信息请持续关注我们店铺!一般来说,如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样。
但是函数指针长度可能与数据指针的长度不同。
指针的长度取决于使用的机器和编译器,例如:在现代windows 上,指针是32位或是64位长测试代码如下:#include<stdio.h>#include<math.h>#include<stdlib.h>#include<stddef.h>struct p{int n;float f;};int main(){struct p *sptr;printf("sizeof *char: %d ", sizeof(char*));printf("sizeof *int: %d ", sizeof(int*));printf("sizeof *float: %d ", sizeof(float*));printf("sizeof *double: %d ", sizeof(double*));printf("sizeof *struct: %d ", sizeof(sptr));return 0;}运行结果如下图所示:指针相关的预定义类型:① size_t:用于安全地表示长度② ptrdiff_t:用于处理指针算术运算③ intptr_t:用于存储指针地址④ uintptr_t:用于存储指针地址分述如下:一、size_t类型size_t 类型是标准C库中定义的,应为unsigned int,在64位系统中为long unsigned int。
C语言指针详解2008-05-08 22:45第一章。
指针的概念指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。
让我们分别说明。
先声明几个指针放着做例子:例一:(1)int *ptr;(2)char *ptr;(3)int **ptr;(4)int (*ptr)[3];(5)int *(*ptr)[4];如果看不懂后几个例子的话,请参阅我前段时间贴出的文章 < <如何理解c和c++的复杂类型声明>>。
1。
指针的类型。
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
这是指针本身所具有的类型。
让我们看看例一中各个指针的类型:(1)int *ptr; //指针的类型是int *(2)char *ptr; //指针的类型是char *(3)int **ptr; //指针的类型是 int **(4)int (*ptr)[3]; //指针的类型是 int(*)[3](5)int *(*ptr)[4]; //指针的类型是 int *(*)[4]怎么样?找出指针的类型的方法是不是很简单?2。
指针所指向的类型。
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。
例如:(1)int *ptr; //指针所指向的类型是int(2)char *ptr; //指针所指向的的类型是char(3)int **ptr; //指针所指向的的类型是 int *(4)int (*ptr)[3]; //指针所指向的的类型是 int()[3](5)int *(*ptr)[4]; //指针所指向的的类型是 int *()[4]在指针的算术运算中,指针所指向的类型有很大的作用。
C语言指针教学中的知识点分析与总结C语言是一门重要的计算机基础课程,指针是C语言的精华。
而指针应用范围广、使用灵活等特点时常让初学者感到困惑。
用指针可以访问各种类型的数据,能够实现动态存储分配,提高编程效率,加深对数据存储方式的理解。
本文从指针的基本概念,指针在数组、函数、字符串、动态存储分配等方面的应用入手,剖析指针与各部分基础知识相结合时的教学重点和难点。
利用对比的方法指出初学者在学习指针过程中易混的概念及注意事项,有利于初学者对指针的理解和掌握。
1指针基本概念的理解指针学习首先应掌握其基本概念。
指针即地址、地址即指针。
程序运行过程中,变量、数组、函数等都存放在内存的存储单元中,每个存储单元都有地址。
使用变量、数组、函数既可以直接访问,又可以利用其存储单元地址进行间接访问,这种间接访问便是借助指针来完成的。
1.1对指针类型的理解理解指针概念要从指针类型入手,教师在教学中应着重讲述指针类型的含义,以及与普通变量类型的区别。
指针定义时的类型称为指针的基础类型,理解上应区别于普通变量的类型。
如定义:由上表可以看出,普通变量的数据类型决定了其占用内存单元的字节数以及存放数值的范围。
而指针变量不论其基础类型为何种类型,均占用4 个字节的存储空间。
并且指针变量与普通变量最大的区别在于,指针变量存地址值,而普通变量存数值。
1.2指针运算符的理解1.2.1对取地址符“ &”的理解指针变量定义后应为其赋一个有效地址值,让它指向有效的存储空间。
未赋值的指针变量称为“悬空”指针,使用悬空指针非常危险,可能会导致系统崩溃。
为指针变量赋值时常要用到取地址运算符“ &”。
令初学者常常感到困惑的是分不清赋值号左右两侧的数据类型是否匹配。
图1 所示为指针变量正确的赋值关系。
1.2.2对取内容符“ * ”的理解取内容符“ * ”又称间接运算符。
当指针指向某存储单元后,利用指针访问该存储单元的内容便要用到取内容符。
C语言学习中的指针用法教程对于C语言初学者来说,需要明白指针是啥?重点就在一个“指”上。
指啥?指的地址。
啥地址?内存的地址。
上面说明就是指针的本质了。
这里再详细解释下。
数据存起来是要存在内存里面的,就是在内存里圈出一块地,在这块地里放想放的东西。
变量关心的是这块地里放的东西,并不关心它在内存的哪里圈的地;而指针则关心这块地在内存的哪个地方,并不关心这块地多大,里面存了什么东西。
指针怎么用呢?下面就是基本用法:int a, b, c;double f;int *pt_a = a, *pt_b = b, *pt_c = c;double *pt_f = f;上面两行声明了三个int类型的变量a,b,c,一个double 类型的变量f。
下面就是指针的用法了,声明变量的时候只需要在变量前面加上“*”这个符号就说明了这个变量是指针,而前面的“int”说明指针指向的内存里面存放着int类型的变量。
变量和指针的声明也可以放到一起:int a, b, c;double f;int other, *pt_a = a, *pt_b = b, *pt_c = c;double x = 0, *pt_f = f;然后就是新的运算符——“”了。
是不是很熟悉?没错,这个就是scanf里面的那个“”。
它是取地址符,即用在变量前面使用这个运算符,能够获得这个变量在内存里面的地址。
由此就可以解释scanf双引号后面为何要使用“”了,就是将前面按照格式读进来的数据,按照后面给出的地址直接填进内存里,所以scanf 双引号后面提供的参数实质上并不是希望赋值的变量,而是希望保存数据的地址。
所以,例如如果有int类型的变量a,同时有指向它的指针pt,那么下面两句是等效的:scanf(%d, a);scanf(%d, pt);回到指针,接下来就是修改指针指向变量的值了,怎么弄呢?下面就是例子:int a;int *pt = a;*pt = 123; // 该语句等同于a = 123;不要把“*”给忘了哈。
C语言指针详解1 程序如何运行当我们打开电脑中的任何一个程序运行时,我们的操作系统会将该程序存在硬盘的所有数据装载到内存中,然后有CPU 进行读取内存中的数据并进行计算,并将计算的结果返回给我们的操作系统,然后操作系统将相应的动作交付给相应的硬件来完成。
如:将声音数据交给声卡,最后有音响输出来,将图像交给显卡最后有显示器输出……但是还会有一部分数据会返回给内存,以供程序下面的语句继续使用。
我们都知道内存的容量有很大,如:4G,8G, 16G,有时候我们会打开很多的程序,所有的程序的数据都存放到我们的内存中,那么CPU是如何正确的读取我们的不同程序的数据并加以计算的哪?2 内存的假设设计为了让我们的CPU 可以很好的读取内存中的数据,内存必须做优化设计,于是给内存设定了集合设计,将我们的内存分成很多大小相同的方格(盒子),所有的数据将放入这些小盒子中,将不同的程序的数据放入到不同的小盒子中,这样就出现的模块化的内存,当我执行程序的一个命令时,CPU就会从相应的盒子读数据然后计算,由于我们硬件所能访问或计算的最小单位是字节,所以内存中的这样的一个小盒子的大小就给他规定一个字节。
3 地址和指针一般我们声明一块内存空间的时候,会给他取一个名字,为的是我们在编写程序的时候方便使用空间中存放的值,但是CPU 读数据的时候会忽视这个名字,因为CPU无法理解这样的数据,CPU 只能执行0,1代码,那么CPU是如何知道从什么地方读取数据,又到什么地方地址数据的读取的那,所以必须对内存做2次设计,就是将内存中分成的很多小盒子下面标注一些顺序的序号,例如:从第一个盒子开始,标注1,2,3,4,5,6,7,……每一个数字对应一个盒子,但是真正的内存如中不是使用这些十进制数字的,而是使用16进制整数表示的,如0x16ffee。
这些我们标记的数字就叫做内存中的地址。
由于这些地址和盒子是对应的关系,所以只要知道了地址,就可以得到对应盒子中存放的数据了,形象的说,我们说这个地址指向对应的盒子,在C语言中可以通过地址得到对应盒子的数据是*地址。
C语言基础知识函数指针指针函数(定义格式作用及用法说明)函数指针和指针函数是C语言中的两个概念。
1.函数指针:函数指针是指向函数的指针变量。
即函数的地址可以赋给指针变量,使指针变量指向函数。
声明函数指针的一般形式为:返回值类型(*指针变量名)(参数列表)。
其中,指针变量名用于存储函数的地址。
函数指针的作用和用法:-回调函数:函数指针常用于回调函数的实现。
回调函数是指当一些事件发生时,调用预先注册好的函数来处理该事件。
-函数指针数组:函数指针可以存储多个函数的地址,通过数组的形式可以实现函数指针的集合。
-函数指针作为参数:函数指针可以作为函数的参数传递,实现函数的灵活调用。
函数指针的定义格式如下:```c返回值类型(*指针变量名)(参数列表);```示例代码:```c#include <stdio.h>int add(int a, int b)return a + b;int subtract(int a, int b)return a - b;int maiint (*p)(int, int); // 声明函数指针变量pp = add; // 函数add的地址赋给pint result = p(3, 4); // 调用函数指针p,相当于调用了add函数printf("Result: %d\n", result); // Output: Result: 7p = subtract; // 函数subtract的地址赋给presult = p(8, 5); // 调用函数指针p,相当于调用了subtract函数printf("Result: %d\n", result); // Output: Result: 3return 0;```2.指针函数:指针函数是指返回值是指针类型的函数。
即函数可以返回指向其中一种类型的指针。
指针函数的声明形式为:返回值类型*函数名(参数列表)。
C语言指针用法详解C语言指针用法详解指针可以说是集C语言精华之所在,一个C语言达人怎么可以不会指针呢。
下面店铺给大家介绍C语言指针用法,欢迎阅读!C语言指针用法详解(1)关于指针与数组的存储a、指针和数组在内存中的存储形式数组p[N]创建时,对应着内存中一个数组空间的分配,其地址和容量在数组生命周期内一般不可改变。
数组名p本身是一个常量,即分配数组空间的地址值,这个值在编译时会替换成一个常数,在运行时没有任何内存空间来存储这个值,它和数组长度一起存在于代码中(应该是符号表中),在链接时已经制定好了;而指针*p创建时,对应内存中这个指针变量的空间分配,至于这个空间内填什么值即这个指针变量的值是多少,要看它在程序中被如何初始化,这也决定了指针指向哪一块内存地址。
b、指针和数组的赋值与初始化根据上文,一般情况下,数组的地址不能修改,内容可以修改;而指针的内容可以修改,指针指向的内容也可以修改,但这之前要为指针初始化。
如:int p[5];p=p+1; 是不允许的而p[0]=1; 是可以的;//int *p;p=p+1; 是允许的p[0]=1; 是不允许的,因为指针没有初始化;//int i;int *p=&i;p[0]=1; 是允许的;对于字符指针还有比较特殊的情况。
如:char * p="abc";p[0]='d'; 是不允许的为什么初始化了的字符指针不能改变其指向的内容呢?这是因为p 指向的是“常量”字符串,字符串"abc"实际是存储在程序的静态存储区的,因此内容不能改变。
这里常量字符串的地址确定在先,将指针指向其在后。
而char p[]="abc";p[0]='d'; 是允许的这是因为,这个初始化实际上是把常量直接赋值给数组,即写到为数组分配的内存空间。
这里数组内存分配在先,赋值在后。
(2)关于一些表达式的含义char *p, **p, ***p;char p[],p[][],p[][][];char *p[],*p[][],**p[],**p[][],*(*p)[],(**p)[],(**p)[][];能清晰地知道以上表达式的含义吗?(知道的去死!)第一组:char *p, **p, ***p;分别为char指针;char*指针,即指向char*类型数据地址的指针;char**指针,即指向char**类型数据的指针;他们都是占4字节空间的指针。
指向指针的指针——彻底搞定C指针彻底搞定C指针---指向指针的指针彻底搞定C指针---指向指针的指针一( 回顾指针概念:今天我们又要学习一个叫做指向另一指针地址的指针。
让我们先回顾一下指针的概念吧~当我们程序如下申明变量:short int i;char a;short int * pi;程序会在内存某地址空间上为各变量开辟空间,如下图所示。
内存地址?6 7 8 9 10 11 12 13 14 15 ------------------------------------------------------------------------------------- … | | | | | | | | | | -------------------------------------------------------------------------------------|short int i |char a| |short int * pi|图中所示中可看出:i 变量在内存地址5的位置,占两个字节。
a变量在内存地址7的位置,占一个字节。
pi变量在内存地址9的位置,占两个字节。
(注:pi 是指针,我这里指针的宽度只有两个字节,32位系统是四个字节)接下来如下赋值:i=50;pi=&i;经过上在两句的赋值,变量的内存映象如下:内存地址?6 7 8 9 10 11 12 13 14 15 -------------------------------------------------------------------------------------- … | 50 | | | 6 | | | |--------------------------------------------------------------------------------------|short int i |char a| |short int * pi|看到没有:短整型指针变量pi的值为6,它就是I变量的内存起始地址。