怎么理解指针的指针?其实这个概念并不难,只是把它放到实际应用中,容易造成困扰。
指针的指针还得先从指针讲起。
先有一个变量,假设它是整型,在系统中占 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变成了一个合法的地址,程序就能顺利运行。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !