c - 二维数组中的不同指针符号?

标签 c pointers multidimensional-array

这些是用于二维数组的符号

char (*names)[5] ;

char* names[] = {"Jan","Feb"};

char names[3][5] = { Initializers..};

我对这些符号感到非常困惑。

第一个将名称声明为指向 5 个字符的数组的指针,即

names -> a char pointer -> "Some string"

第三个有一个不同的内存映射,即它像普通数组一样按行主要顺序存储,这与上面提到的不同。

第二个符号与第一个和第三个符号有何相似或不同之处?

将它们传递给函数则完全是另一回事。如果我们将二维数组声明为类型 2,则将其作为双指针 (char** names) 传递,而如果它是类型 1 或类型 3,则应在中提及列声明。

请帮助我更清楚地了解这些问题。 谢谢。

最佳答案

这些例子中只有一个是二维数组:

char names[3][5];

其他的不一样:

char (*names)[5] ;

是指向一维数组的指针,并且:

char* names[] = {"Jan","Feb"};

是一维指针数组。

我现在要重命名它们以便更清楚:

char a[3][5];
char (*b)[5];
char *c[3];

a 是唯一真正的二维数组。也就是说,它占用连续的内存,并有空间容纳三个字符串,每个字符串长度为 5 个字符(包括空终止符)。

b 是指向数组的指针;不包括该数组的任何潜在内容的存储空间。

c 是一个指针数组,每个指针都可以用来指向你碰巧关心的任何字符串;没有为任何字符串本身保留存储空间,只为三个指针保留空间。

如果你有一个原型(prototype)如下的函数:

void myfunction(char **p);

只有c可以传递给这个函数;其他人不会按照您希望的方式行事。

关于c - 二维数组中的不同指针符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18343555/

相关文章:

jQuery 多维数组名称选择器

php - array_unique 用于数组内的数组

java - 折叠二维数组列表

c++ - 函数指针和 C++ 模板

C++指针奇怪的未定义行为

c - 从函数返回 char* 和 char[] 有什么区别?

c - 对齐有错误

c - __builtin_dmaoffset() 的参数不是 dma 节中对象的地址;

c - Linux dma 设备驱动程序 dma_request_channel 失败

c++ - 堆栈地址是否由堆地址共享?