请有人解释一下
的区别char *names[3]
和
char (*names)[3]
以及如何读取此运算符?
如果我想为他们动态分配内存该怎么办?
对于第一种情况,我认为它只是长度为3的char*
的数组,因此没有不适用的内存分配。但是在第二种情况下如何进行内存分配?
答案 0 :(得分:3)
遇到类似问题时,通常可以转到cdecl
(在线版本here):
cdecl> explain char *names[3]
declare names as array 3 of pointer to char
cdecl> explain char (*names)[3]
declare names as pointer to array 3 of char
因此前者创建了三个指向字符的指针的数组:
+----------+
| names[0] | -> char
| [1] | -> char
| [2] | -> char
+----------+
后者将创建一个单个指针,该指针指向大小为3的char数组。
+-------+
| names | -> char, char, char - no, not a dance step :-)
+-------+
答案 1 :(得分:1)
第二行decodes as“将名称声明为指向char数组3的指针”。
我写C已有25年以上了,我从未使用过这样的变量。
无论如何,我想这应该可行:
char data[3];
char (*names) = data;
请注意,变量名称names
极易引起误解,因为变量仅包含3个单个字符,而char *names[3]
则是三个指向字符的指针,因此很容易用来容纳三个字符字符串。
还要注意,上面的代码没有什么意义,如果有,您可以直接使用data
。
答案 2 :(得分:1)
第一个数组包含三个指向char
的指针。
第二个是指向三个char
的数组的指针。
(将其读取为“ *names
是char[3]
”)。
您可以通过获取三个char
的数组的地址来创建这样的指针:
char name[3];
char (*names)[3] = &name;
或以常规方式动态地>
char (*names)[3] = malloc(sizeof(*names)); /* or sizeof(char[3]), if you're fond of bugs */
或通过常规的数组到指针转换:
char stuff[2][3] = {};
char (*names)[3] = stuff; /* Same as &stuff[0], as normal. */
答案 3 :(得分:1)
char *names[3]
是3个char
指针的数组。char (*names)[3]
是指向3个字符的数组char[3]
的数组指针(指向数组的指针)。所以这两个有根本不同的含义!不要将它们彼此混淆。
如果您希望分配指针数组,则可以按照以下任一示例进行操作:
char** names = malloc(3 * sizeof(*names) );
char** names = malloc(sizeof(char*[3]));
char** names = calloc(3, sizeof(char*));
这些都是等效的(但calloc还将所有指针设置为NULL)。 names
将是指向数组中第一个元素的指针。它将是指向char*
的指针。
如果要分配数组并指向第一个元素,只需执行以下操作:
char* names = malloc(3 * sizeof(*names));
或者,您可以使用数组指针语法并指向整个数组:
char (*names)[3] = malloc(sizeof(*names));
答案 4 :(得分:1)
以及如何读取此运算符?
让我们选择第二个,因为它是两者中较复杂的一个:
char (*names)[3];
当您查看这样一个复杂的定义时,最好的攻击方法是从中间开始并逐步解决。 “从中间开始”表示从变量名names
开始。
“解决问题”是指向右看最近的项(在这种情况下,什么都没有;右括号会使您简短),然后向左看(以星号表示的指针),然后向右看( 3的数组,然后向左看(char)。
此左右左右运动适用于大多数声明。
这意味着names
是一个指向大小为3的char数组的指针。
这是一个很奇怪的声明,但是就是这样读的。
如果我想为他们动态分配内存,怎么办?
现在您知道了声明的含义,内存分配变得很容易:
char (*names)[3] = malloc(3 * sizeof(char));