c语言函数里的指针 c语言函数指针的用法( 二 )


这也是引入“指针”概念的一个重要原因 。
怎么理解C语言里的指针?指针就是内存的地址 。
内存懂吧,就是放数据的地方,数据就像一个人的家,懂吧,一栋楼里 , 肯定住了不止一家人吧,那么确定每家的地址,就需要几楼几零几这样设置地址吧 。内存也是一样的 , 内存是按一个字节的大小来安排地址的 。
比如int a;我们申请了一个int型,整形的变量,int是四个字节的数据类型,所以变量a在内存上会有一个地址,地址是按第一个数字为准的 。假设内存上没有任何数据 , 都是空的,那么内存就会按顺序来放地址 , 假设内存的第一个地址是0,以此类推,那么当我们int a变量的时候,内存就会把0-3地址的空间分配给变量a,因为a占四个单元内存 , 那么怎么确定变量a的地址呢?计算机是按这个内存地址上的最开始那个算的,即变量a的地址是0 。
当我们在声明了int a变量之后 , 再声明一个char b变量 。如下:
int a;
char b;
这个时候,int a先被声明了,假设内存是空的 , 那么变量a就会被安排0-3的地址 。第二个声明char b;就会接在变量a之后,因为char是一个字节的数据,所以内存只会分配一个4号内存给变量b,变量b的地址就是4 。以此类推,其他类型是一样的 。
指针就是用来存放内存地址的地方 。指针变量一般也会单独存放 。
比如:
inta;//内存分配编号为0-3的内存空间给变量a;变量a的地址就是最开头的那个编号即变量a的地址是0;
char b;//内存紧接着分配编号为4的内存空间给变量b,因为char是一个字节的,所以变量b的地址唯一,就是4 。
随后,我们申请指针 。
int*p;
char * t;
我们申请了两个指针, *是指针的标志,有*的变量是指针,没有*的是一般变量,*只是用来区别变量是int型数据还是指针 。
当变量是指针的时候,意味着这个变量只能存放内存地址,而不能存放任何自然数 。
即指针p,只能用p=a;变量a在C语言中 , 单用的时候,使用变量a里面存放的值 , 而不是他的地址,比如 我们再声明一个变量 int g; g=a;这个例子里 , 我们声明了一个int型变量g,并用g=a来初始化g,g=a的意思是 , 用a里存放的数,即读取出a里面存的数 , 然后把这个数给g,并不是把a的地址给g 。所以C语言里规定了符号为取地址操作符 , p=a;的意思就是取出a的地址,给p,这个时候是可以的,因为p是指针,并且p指针指向的类型是int 。
在C语言中,给指针赋地址,要检查变量的类型的,比如int *p;这个指针p,p前面的*表示他是指针 , 说明他只能存放地址,*号前面的类型说明符,进一步说明,p这个指针只能存int型变量的地址,即如果p=b;是不会成立的,并且会报错,因为p是一个存放int型变量的指针,而变量b是一个char型变量 , 在C语言里,指针和对应的变量的类型要一致 。不能够混用 。
不能混用的原因在于,到时候解引用的时候会出错,即如果 p=b,成立的话,那么到时候使用 a=*p;的时候会出现严重错误,因为p=b,是把char型变量的地址给int型指针 , 当我们在使用解引用符号*的时候,就会错误,a=*p;的意思是,用p里存放的地址,找到内存上的数据 , 并且给变量a,编译器会检查,得知p是int型变量指针,所以需要按照这个地址取出的数据是四个字节的数据,所以程序会把b的地址4按照int型的数据变量地址来使用,会调取内存上编号为4,5,6,7号位的数据,然而编号为4的内存上放的是char 型变量b的数据,5 , 6,7号内存上,根本没有数据,从而出错 。所以C语言严格要求,指针的类型和变量类型要一致,即int *的指针只能存放int型变量的地址,不可混用 。

推荐阅读