C语言指针的概念,它例子具体点
发布网友
发布时间:2022-04-28 23:09
我来回答
共4个回答
热心网友
时间:2022-06-25 00:09
要明白指针的概念,首先得明白程序中的变量在内存地址空间中如何存放。
内存地址空间以字节为单位,包括程序的代码段、数据段、堆还有栈。
一个变量有两个属性:变量类型和变量名。通过变量名我们可以找到该变量的第一个字节在地址空间内存放的位置(即内存地址);通过变量属性(即变量类型)我们知道该变量总共占用几个字节,这样每次访问它就知道取多少个字节,例如int型变量一般32位,即占用4个字节。
一个变量在定义之后,程序会给它分配内存,这个内存地址是不会变的,直到这个变量过期。
这样,除了通过变量名来访问该变量之外,如果我们知道了该变量在内存中存放的位置,那应该就能直接对该变量进行读写。如果能这样做,在某些情况下还是有很大便利性的。C语言如何实现该功能?指针。
用指针来指向变量,(即通过指针来访问变量),其实就是直接访问该变量的内存地址。为了安全起见,一个指针的类型必须与该指针指向的变量类型相对应,因为在用指针来取代变量名进行各种操作时,编译器会首先判断该操作是否合法。指针也必须能包含变量的这两个属性,不然怎么访问该变量。指针保存的值就是它指向的变量在内存中的起始位置;指针的类型表明该指针指向的是什么类型的变量。
例如,int * pi = &a;
pi指向int型变量a,这样pi的值就是a的起始内存地址,pi是int*型指针。
这样通过解引用操作符*就可以通过*pi来访问a的值(访问a的内存地址来获得a的值),在需要使用a的时候,我们可以用*p来取代,例如:
*p = 1 + 2; // a = 1 + 2;
m = *p * 3; m = a * 3;
一般,初学者对C指针的困惑有两个地方:一个是多重指针,另外一个是强制类型转换。
多重指针,即指向指针的指针,例如 int ** ppi。指针也是变量,指向指针的指针无非就是它指向的类型是指针,例如,这里ppi是一个指针,它指向的变量类型是int*型指针。对ppi解一次引用可以访问该int*指针变量,对该int*变量再解一次饮用可以访问该指针指向的int型变量,即**ppi。
强制类型转换,例如,char * pc = (char *)pi;通过*pc访问的是*pi的第一个字节。
其实只要记住一点就行了,指针有两个属性,它保存的内存地址和它指向的变量类型。通过强制类型转换,其实转换的是编译器对该指针所指向的变量类型的转换。例如,本来pi指向的是一个4字节内存,通过强制转换,pc指向的就是一个1字节内存,内存起始地址没变,变的只是每次访问该内存所访问的字节数。
例如,有一个常见的例子,如何判断机器的内存模型是大端还是小端?(一个多字节变量存放在内存中时低地址处存放的是高字节还是低字节,前者是大端,后者是小端)
int a = 0x01;//声明一个4字节int型变量,高字节是0,低字节是1
char* pc = &a;//声明一个指向char的指针,这样通过pc访问的内存是一个字节,即通过pc可以访问到a占用的第一个字节(低地址处),通过*pc的值即可判断是大端还是小端
if (*pc == 1) printf("小端");
else printf("大端");
热心网友
时间:2022-06-25 00:10
指针这个词汇实际上是个,形象的比喻——
比喻一个箭头,指向内存中的某个数据块——
事实上现代计算机系统中确实存在这样的数据块,但不存在这样的任意箭头!
指针确切的语义是地址。是一个数据类型,跟int是一个数据类型一样。
是类型,就可以实例化。比如,int的实例是整数,指针的实例是地址。如此而已~
热心网友
时间:2022-06-25 00:10
指针 就是地址,对应着内存中的地址,
就好比北京市是内存条,"长安街100号"就是地址,也就是指针,他的内容是一个房子。
int* pointer = 0; 声明了一个指针,就是声明了长安街100号,但是这是他只是纯粹意义的一个符号,因为他不指向任何实际的内容
pointer = malloc(1); //pointer指向了内存中的一块内存,就好比给长安街100号这个符号给上了意义,现在它就代表在东经XXX北纬XXX的一个具体的位置。
*pointer 就是查看pointer具体指向的内容,就代表东经XXX北纬XXX
总的来说,指针就是地址,他指向内存中的具体的一个位置
热心网友
时间:2022-06-25 00:11
比方说一个普通的long类型值:0x00400300,把它看成一个普通数他就是0x00400300,可是把它看成指针那么就表明你注重的是0x00400300这个地址存储的值。我们都知道每个数据在进程当中都是要有地址去存储它的,就好比水要有瓶子来装 一样。这里,我们把0x00400300当做是瓶子,我们要关注的是瓶子里的水。所以就有指针这个概念。