首先了解“数组不是指针”。
int p[] = (int []) {1,2,3,4,5,6};
在上述情况下p
是一个整数数组。将元素复制{1,2,3,4,5,6}
到p
. 这里不需要进行类型转换,rvalue
并且 和lvalue
类型都匹配,这是一个整数数组,因此没有错误。
int *p[] = (int *[]) {{1,2,3},{4,5,6}};
“请注意,我不明白为什么我在第一个中遇到错误,..”
在上述情况下,p
一个整数指针数组。但它{{1,2,3},{4,5,6}}
是一个二维数组(即 [][] )并且不能被类型转换为指针数组。您需要初始化为 -
int p[][3] = { {1,2,3},{4,5,6} };
// ^^ First index of array is optional because with each column having 3 elements
// it is obvious that array has two rows which compiler can figure out.
但是为什么这个语句编译了?
char *p[] = {"one", "two"...};
字符串文字不同于整数文字。在这种情况下,p
也是一个字符指针数组。实际上"one"
,它既可以被复制到一个数组中,也可以指向它的位置,认为它是只读的。
char cpy[] = "one" ;
cpy[0] = 't' ; // Not a problem
char *readOnly = "one" ;
readOnly[0] = 't' ; // Error because of copy of it is not made but pointing
// to a read only location.
使用字符串文字,上述任何一种情况都是可能的。所以,这就是编译语句的原因。但 -
char *p[] = {"one", "two"...}; // All the string literals are stored in
// read only locations and at each of the array index
// stores the starting index of each string literal.
我不想说编译器的数组有多大。
使用动态分配内存malloc
是解决方案。
希望能帮助到你 !