c语言、二级指针

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


一级指针

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)的地址

猜你喜欢

转载自www.cnblogs.com/JacsonY/p/10547842.html