3

我对指针thingy.graduated从指针->指针数组->函数指针->指向指针的指针坐立不安。

这就是我所坚持的……主要是复杂的语法。

可以说我有一个整数数组。

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 上括号的使用请解释。

4

3 回答 3

3
char** btr[4]= &crr; // Exception: cannot convert char* [4] *  to char**[4]

那是试图从一个指针初始化一个数组(指向指针的指针),这是你做不到的。如果你想初始化第一个指向的元素crr(如你的第一个例子),那么你会做

char** btr[4]= {crr};

最后一个例子是声明一个指向数组(指针)的指针,并从一个兼容的指针初始化它。

请注意,您的原始数组应该是 of const char *,而不是char *,因为它包含指向(常量)字符串文字的指针。

于 2013-10-21T17:35:20.117 回答
2

除非它是sizeof或一元运算符的操作数&,或者是用于在声明中初始化另一个数组的字符串字面量,否则“N 元素数组T”类型的表达式将被转换(“衰减”)为键入“pointer to T”,表达式的值将是数组第一个元素的地址。

当你写

btr[0] = crr;

表达式crr的类型为“4 元素数组char *”;因为它不是sizeofor&运算符的操作数,所以它被转换为类型“指针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

指针和函数也是如此:

T *f();                // f is a function returning a pointer to T
T (*f)();              // f is a pointer to a function returning T
T *(*f)();             // f is a pointer to a function returning pointer to T
于 2013-10-21T18:29:04.227 回答
1

让我们看看你的定义:

  1. char* 大小为 4 的数组

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

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

    char** btr[4]

  3. 指向大小为 4 的 char* 数组的指针

    char* (*btr)[4]

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

你有绝对合法的指针类型Pointer to an array of size 4 of char*,你的数组地址可以分配给它

于 2013-10-21T17:39:44.917 回答