C语言指针简单入门介绍
#include<stdio.h>
void test(int *p1){
*p1=114514;
}
int main(){
int *p1=NULL;
int p=2333;
p1=&p;
printf("*p1=%d,p1=%d,&p1=%d,&(*p1)=%d,\np=%d,&p=%d\n",*p1,p1,&p1,&(*p1),p,&p);
test(p1);
printf("*p1=%d,p1=%d,&p1=%d,&(*p1)=%d,\np=%d,&p=%d\n",*p1,p1,&p1,&(*p1),p,&p);
printf("\n");
return 0;
}
对于一个指针的操作有&以及*,首先对于&为取对应变量所在的内存地址,而令一个则为解析或者说解压操作,一般是将对应内存所在的数值给显示出来。对于此时main()函数中首先定义了一个int类型的指针p1(定义语句必须用星号来定义这样所对应的才是解析的数值),定义的同时也给指针所存储地址的数值赋值为NULL即为空,之后定义了一个整数p为2333,对于语句p1=&p;是将整数变量p的地址存入指针p1内,即指针p1的内容即为p所在的地址。对于其运行结果为:
用图像方法来进行分析如下:
即指针的定义形式只能是:指针类型 *指针名(必须为*即使是多级指针也是多个*)
即开始时指针p1一经建立系统便分配给其一个地址(1703724)同理整形变量p也分配了一个地址(1703720),又int p=2333;后p存储的内容变为2333,之后对于赋值语句p1=&p;为将p所在的地址赋值给指针p1作为其内的内容,但注意这只是p1所存储的内容而非p1所在的地址(1703724),要理清作用:p1:指的是指针p1存储的内容(1703720) &p1:指的是指针p1所在的地址(1703724) *p1:是指针p1存储内容所在内存的具体数值(此时为内存1703720存储的内容即为:2333);故而未经历test()函数前结果便如上图所示。对于经历了test(p1)后实际代码*p1=114514;仅为将指针P1内容所指的内存的数值换成114514;故而结果便如上图所示仅仅为*p1发生了变化,注意:对于*一般只能作用域指代内存的变量!而对于&(*p1):首先*p1指的是指针p1存储内容所在内存的具体数值,即为内存1703720所存储的内容,而&则是此内容所在的内存即为(1703720).
不足之处:无法对指针的内存进行修改例如如果test的代码改成&p1=114514;将会报错因为p1本身就是一个内存的详细地址,无法再通过&来进一步取地址也就无法修改详细的地址,故而无法改变地址,只能改变地址所在的数值。故而有了多级指针的存在(本节并未涉及内存的改变)。
#include<stdio.h>
void test2(int **p){
printf("**p=%d,&(*p)=%d,*p=%d,p=%d,&p=%d\n",**p,&(*p),*p,p,&p);
}
int main(){
int *p1=NULL;
int p=114514;
p1=&p;
printf("*p1=%d,p1=%d,&p1=%d,&(*p1)=%d\n",*p1,p1,&p1,&(*p1));
test2(&p1);
getchar();
return 0;
}
运行结果如下:
借由图像进行分析具体图像如下:
首先要注意二级指针实际上就是针对一级指针的指针,定义方式为int **p对于此时的test函数仅为:对于传来的二级指针的实参进行相关信息的打印而已,而对于传来的参数的需求及p应为对应一级指针所在的地址(这样*p就是对应一级指针的内容(存储数值所在的地址)即为1703720,紧接着**P就是具体所存储的数值114514即为对应的int类型)对于main函数内部前三句代码以及打印函数与之前一级指针分析的一致此时不再赘述可以参考上方讲解,故而此时p1已为一级指针,而对于要传递的二级指针实参内容应为对应一级指针的地址,故而将&p1也就是一级指针的地址,作为实参传递给test(&p1)后开始执行test内关于二级指针具体详细信息的打印:*p:即为二级指针存储内容所代表的内存所存储的数据(即为一级指针的内容170370),**p:即为对应一级指针存储内容所代表的的内存所存储的数据,为整形数据114514.&(*p):是求出数值*p的所在地即还是一级指针的地址1703724.p:即为二级指针所具体存储的数据(为一级指针所在的地址1703724) &p:为二级指针自身所在的地址1703728. 此即为此次代码的所有详细信息。
注意此时也并未涉及内存的突然改变,只是可以对于指针的内容进行改变例如可以将二级指针的内容1703724改为其它一级指针所在的地址。
多级指针也只是在此基础上不断套娃而已按照此基础画出图形就可以解决。下节进行对于二级指针的相关应用。