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

时间:2012-04-17 00:38:13

标签: c arrays pointers syntax

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

2 个答案:

答案 0 :(得分:8)

与往常一样,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

答案 1 :(得分:0)

如果您的函数有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);