三星:char *(* arr)和char *** arr(在C中)有什么区别?

基本上,我有一个char *数组,我想在这个函数中传递和修改,所以我传入一个指向char *数组的指针。 也就是说,我想传递一个指向char * arr []的指针。 两者有什么区别?

一如既往, http : //cdecl.org是您的朋友:

  • char * (*arr)[] – “将arr声明为指向char的指针数组的指针”
  • char *** arr – “声明arr作为指向指向char的指针的指针”

这些都不一样。 首先,第一个是不完整的类型(为了使用指向数组的指针,编译器需要知道数组大小)。

你的目标并不完全清楚。 我猜你真正想做的就是修改char *数组中的底层数据。 如果是这样,那么你只需将指针传递给第一个元素:

 void my_func(char **pointers) { pointers[3] = NULL; // Modify an element in the array } char *array_of_pointers[10]; // The following two lines are equivalent my_func(&array_of_pointers[0]); my_func(array_of_pointers); 

如果你真的想传递一个指向数组的指针,那么这样的东西就可以了:

 void my_func(char *(*ptr)[10]) { (*ptr)[3] = NULL; // Modify an element in the array } char *array_of_pointers[10]; // Note how this is different to either of the calls in the first example my_func(&array_of_pointers); 

有关数组和指针之间重要区别的更多信息,请参阅C FAQ的专用章节: http : //c-faq.com/aryptr/index.html 。

如果你有一个char *(*arr)[]作为参数的函数,你需要传入一个带有地址运算符的数组:

 void afunc(char *(*arr)[]); char *charptra, *charptrb, *charptrc; char *arr[] = {charptra, charptrb, charptrc}; afunc(&arr); 

另一方面,您必须传递指向指向指针的指针的指针:

 void afunc(char ***); char arr[] = "str"; char *arrptr = arr; char **arrptrptr = &arrptr; char ***arrptrptrptr = &arrptrptr; afunc(arrptrptrptr);