高级指针复杂的语法

时间:2013-10-21 17:29:21

标签: c++ c arrays pointers

我正忙着指点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上使用括号解释。

3 个答案:

答案 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)

让我们来看看你的定义:

  1. char *

    的大小为4的数组

    char* crr[4] ={"C","C++","Java","VBA"};

  2. char **的大小为4的数组

    char** btr[4]

  3. 指向char *

    大小为4的数组

    char* (*btr)[4]

  4. 现在您正尝试将Array of size 4 of char*分配给Array of size 4 of char**,但它们的类型不同,因此您显然会出错。还有另一个规则(主导):你不能在没有花括号的情况下初始化数组,所以数组应该用新数据初始化,而不是指向其他数组的指针。

    你可以为你的阵列地址分配合法的指针类型Pointer to an array of size 4 of char*