码迷,mamicode.com
首页 > 编程语言 > 详细

c语言、二级指针

时间:2019-03-17 21:47:17      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:就是   对比   amp   现在   注意   void   turn   指针   null   

二级指针以及一级指针在使用上是一样的


一级指针

void func(int *x)
{
? ? *x=2;//x是地址,*x是取地址是x的内容,
}

int main()
{
? ? int a=0;
? ? func(&a);//传递时变量a的地址
? ? return a;
}

这里实现了函数内部对变量a的值的改变;
因为传递的是a的地址,然后改变其地址所映射的内存空间的值

二级指针

对于二级指针来说,不同的是传递的这个变量是地址,也即是指针型的变量

void func_1(int **x)
{
? ? int *b,c;
? ? *x=&c;
}

void func_2(int *x)
{?? ?
? ? int d;
? ? x=&d;
)

int main()
{
? ? int *a=NULL;
? ? int *b=NULL;
? ? func_1(&a);
? ? func_2(b);
? ? printf("%d? %d",a,b);
? ? return 0;
}

要在函数内部改变a的值,所以传进的应该是a的地址,形参上应该是**a,,相当于将*a看作一个整体.
对于a,里面存放的是地址,开始时NULL,现在是一个数值;而对于b,存放的也是地址,开始是NULL,后来还是NULL,因为它还是一个传递的变量,不过是一个指针型的变量而已。在运行时,子函数内部只会重新开辟一个一个临时变量来,函数结束后便销毁,所以传进去的这个指针型变量是没有发生任何变化的。

对比

void func(int *a);表示形参是a的地址,函数内部改变了a的内容
void func(int **a);表示形参为(*a)的地址,函数内部改变了*a的内容

注意

int *a,b,c;//表示定义了一个指针型bianliang
b=3;
a=&b;//取b的地址
c=*a;//*a表示取内容。a里存放的是b的地址,这里*a==*(&b)==b
int func(int *a);//这里的*a表示形参为a的地址,而实参则是a
int func(int **a);//这里**a表示形参为(*a)的地址,即指针型变量的地址;而实参为指针型变量a

注意:在形参里,为了区分,a才表示是指针型变量,来让人知道这是什么东西; 而在实参里,如果定义了int a之后,直接就是用 a 代表一个指针型变量。

总结

二级指针可以类比一级指针
要传入子函数的是这个变量的地址,对于普通变量a来说,形参加个*,就表示传的是它的地址;而对于指针型变量来说,**a才表示变量为(*a)的地址

c语言、二级指针

标签:就是   对比   amp   现在   注意   void   turn   指针   null   

原文地址:https://www.cnblogs.com/JacsonY/p/10547842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!