怎么理解指针的指针?

描述

怎么理解指针的指针?其实这个概念并不难,只是把它放到实际应用中,容易造成困扰。

指针的指针还得先从指针讲起。

先有一个变量,假设它是整型,在系统中占 4 个字节。

int a;

内存是以字节为单位,每个字节都有一个地址,所以变量 a 占了4个地址。

变量

在C语言中,描述变量 a 的地址,一般取最前面的这个字节,所以 a 的地址是 0x100。

为了方便计算,很多时候我们想把 0x100 保存下来,于是又需要一个变量,这个变量就是指针变量。指针的大小跟环境有关系,这里假设占 4 个字节。用代码来表示,可以写成:

int *p = &a;

我们也经常说,指针 p 指向变量 a。

变量

既然 p 在内存中占了 4 个字节,那他肯定也有个地址,假设这个地址是 0x1000,如果想把 0x1000 保存下来,那就需要指针的指针。

指针的指针也属于指针,所以在内存中也占 4 个字节。

如果用代码来表示,可以写成:

int **q = &p;

q是个指针,指向变量 p,因为 p 本身也是个指针,所以就把 q 称作指针的指针。

虽然 q 和 p 都是指针,但是也不能随便赋值,比如能不能写成:

q = &a;

q是指针,&a是地址,地址赋值给指针,简直完美。

这个代码完全行不通,因为 q 是 int ** 类型,它只能指向 int *类型的变量,比如 p 就是 int * 类型的变量,而 a 是 int 类型的变量。

关于指针的指针,有个极其经典的笔试题,如果你刷过题,那你一定会遇到。

变量

这个题目问题就出在实参和形参是两块不同的内存,malloc申请的内存,地址记在了形参中,对实参没有任何的影响,所以在主函数中,实参一直是空,把字符串拷贝进去,就会出现段错误。

void init_memory(char **s)
{
    *s = malloc(128);     
}


int main()
{
    char *str = NULL;
    
    init_memory(&str);
    
    strcpy(str, "helloworld");
            
    return 0;
}
修改的方法就是传指针 str 的地址,形参改成指针的指针,于是就出现了 s 指向 str,*s 就是 str,执行init函数,str从NULL变成了一个合法的地址,程序就能顺利运行。





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分