C语言中双指针(**)的作用:为何此程序不使用会报错?
关于C语言双指针(**)的用法及报错原因解析
先直接说核心问题:你调用fun(&ptr)时传递的是指针变量ptr的地址,这个地址的类型是int**,所以fun的参数必须声明为int**才能匹配,类型不兼容就会报错。
拆解细节:
ptr是int*类型,指向二维数组的第一个元素a[0][0]。&ptr是取ptr这个变量本身的内存地址,它的类型是「指向int指针的指针」,也就是int**。- C语言里不允许隐式把
int**转换成int*,如果强行把fun的参数改成int*,编译器会直接抛出类型不匹配的错误。 - 看
fun里的逻辑:**p先解引用p拿到ptr(也就是那个int*),再解引用一次就拿到了ptr指向的a[0][0]的值1,完全合理。
如果想不用双指针,你可以改调用方式:把fun(&ptr)改成fun(ptr),同时把fun的参数改成int*,函数里用printf("%d\n", *p);,这样也能正常输出结果——但这和你当前代码的传参逻辑完全是两回事。
内容的提问来源于stack exchange,提问作者Fahi Farjana Yusra
相关产品推荐
相关产品推荐

