我在使用C指针时遇到问题

时间:2016-11-12 19:08:22

标签: c++ c pointers

我有一个函数,它接受字符串指针的指针foo(char **str)

我写的时候:

//this code makes error-Segmentation fault (core dumped)
char x[2];
x[0] = 'a';
x[1] = '\0';
foo(&x);

但是当我写

char x[2];
x[0] = 'a';
x[1] = '\0';
char *a = x;
foo(&a); //code works perfectly

有谁可以解释这两个代码片段之间的区别是什么?

1 个答案:

答案 0 :(得分:4)

在此函数调用中

foo(&x);

参数的类型为char ( * )[2],它是指向两个元素数组的指针。

在此函数调用中

foo(&a);

参数的类型为char **,它是指向指针的指针。

因此,正确的调用取决于如何声明相应的函数参数。:)

由于函数参数的类型为char **,因此第二次调用是正确的。没有从类型char ( * )[2]到类型char **的隐式转换,因此编译器将为第一个函数调用发出错误。

这两种类型之间的区别在于,应用于第一个指针的解除引用运算符*会生成类型为char[2]的数组,而应用于第二个指针的解除引用运算符会再次使用char *类型的指针。

初学者的困惑在于,对于两个指针,你可以应用下标运算符两次,如ptr[i][j],其中ptr是任一类型的指针,结果看起来类似。