我正忙着指点thingy.graduated from pointers - >指针数组 - >函数指针 - >指向指针..
这就是我所坚持的......主要是令人费解的语法。
假设我有一个整数数组。
int arr[4] = {1,2,3..};
我也有指针数组
int* ptr[4];
ptr[0] = arr;
这里ptr [0]将指向1 和ptr [1]将指向其他位置
这完美无缺!!
现在考虑上面的背景我尝试了这个。
char* crr[4] ={"C","C++","C#","F#"};
char** btr[4];
btr[0] = crr;
作为btr的oth元素中的指针,指向crr。
中的另一个指针元素然后我试了这个。
char* crr[4] ={"C","C++","Java","VBA"};
char** btr[4]= &crr; // Exception: cannot convert char* [4] * to char**[4]
但是当我这样做时,它有效:O
char* crr[4] ={"C","C++","Java","VBA"};
char* (*btr)[4]= &crr;
我还没有理解最后两个场景。在RHS Pls上使用括号解释。
答案 0 :(得分:3)
char** btr[4]= &crr; // Exception: cannot convert char* [4] * to char**[4]
尝试从指针初始化一个数组(指向指针的数组),这是你无法做到的。如果您想初始化第一个元素以指向crr
(如第一个示例中所示),那么您可以
char** btr[4]= {crr};
最后一个例子是声明指向数组(指针)的指针,并从兼容指针初始化它。
请注意,您的原始数组应该是const char *
,而不是char *
,因为它包含指向(常量)字符串文字的指针。
答案 1 :(得分:2)
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N-element array of T
“将被转换(”衰减“)到”指向T
的指针“类型的表达式,表达式的值将是数组的第一个元素的地址。
写作时
btr[0] = crr;
表达式crr
的类型为“{-1}}的4元素数组”;由于它不是char *
或sizeof
运算符的操作数,因此会将其转换为“指向&
”的类型,或char *
。这与char **
的类型相匹配。
但是,当你写
时btr[0]
表达式char** btr[4]= &crr;
是crr
运算符的操作数;因此,表达式&
的类型是“指向&crr
的4元素数组的指针”或char *
。
括号是必要的,因为后缀char *(*)[4]
运算符的优先级高于一元[]
运算符;表达式*
将始终解析为*a[i]
。因此,
*(a[i])
指针和函数也是如此:
T *a[N]; // a is an N-element array of pointer to T
T (*a)[N]; // a is a pointer to an N-element array of T
T *(*a)[N]; // a is a pointer to an N-element array of pointer to T
答案 2 :(得分:1)
让我们来看看你的定义:
char *
的大小为4的数组 char* crr[4] ={"C","C++","Java","VBA"};
char **的大小为4的数组
char** btr[4]
指向char *
大小为4的数组 char* (*btr)[4]
现在您正尝试将Array of size 4 of char*
分配给Array of size 4 of char**
,但它们的类型不同,因此您显然会出错。还有另一个规则(主导):你不能在没有花括号的情况下初始化数组,所以数组应该用新数据初始化,而不是指向其他数组的指针。
你可以为你的阵列地址分配合法的指针类型Pointer to an array of size 4 of char*