指向数组语法的指针

Pointer to arrays syntax

我对数组指针的语法有疑问。 好吧,我们知道数组本身就是指针(我们的大学教授说的)所以为什么当我们用另一个指针(这将是指向指针的指针)指向它们时,我们使用这种语法:

int array[10]; 
int *pointer = array;

而不是这个语法:

int array[10];
int **pointer = &array;

虽然我知道使用 malloc 是正确的,但为什么不是以正常方式,是编译器或语法问题还是我在其他地方错了??

告诉你的教授他们错了。数组是 而不是 指针。数组可以 decay 指向指针,但它们 不是指针。

int* pointer = array; 声明一个指向 array.

中第一个元素的指针

int** pointer = &array; 不正确。正如 jschultz410 在评论中提到的,&array 的类型是 而不是 int**,它是 int (*)[10] 也就是指向10 个整数的数组,不能衰减到 int**.

Well we know arrays are pointers themselves

没有。数组不是指针。数组就是数组。除非它是 sizeof 或一元 & 运算符的操作数,否则类型 "N-element array of T" 的 表达式 将被转换("decay") 到 "pointer toT" 类型的表达式,表达式的值将是数组第一个元素的地址。但是,除了数组元素本身之外,没有为指针预留存储空间。

因此,根据声明

int array[10];

表达式array的类型是“int的10元数组”;除非 arraysizeof 的操作数或一元 &,否则它将衰减为类型 int *。所以

int *ptr = array;

有效。

&array的类型是不是int **;类型是 int (*)[10] 或 "pointer to 10-element array of int"。您将声明并初始化这样一个指针

int (*ptr)[10] = &array;

首先这样定义一个指针

int array[10]; 
int **pointer = &array;

无效。在声明的右侧有一个类型为 int ( * )[10] 的表达式,而在左侧有一个类型为 int ** 的标识符。指针 int ( * )[10]int ** 之间没有隐式转换。因此编译器应发出诊断消息。

正确的定义看起来

int array[10]; 
int ( *pointer )[10] = &array;

现在我们可以考虑这两个定义有什么区别

int array[10]; 
int *pointer = array;

int array[10]; 
int ( *pointer )[10] = &array;

在第一种情况下,指针 pointer 指向的对象的大小等于 sizeof( int )。因此,如果使用指针算法,那么在计算表达式 ++pointer 之后,指针中的值将增加 sizeof( int ) 字节。例如,如果 sizeof( int ) 等于 4,则指针中的值将增加 4

在第二种情况下,指针 pointer 指向的对象的大小等于 10 * sizeof( int ) 即,如果 sizeof( int ) 等于 4,则对象的大小为等于 40。因此,如果指针将增加 ++pointer,其值将增加 40

同样,在第一种情况下取​​消引用指针将得到一个 int 类型的对象,而在第二种情况下取​​消引用指针将得到一个 int[10] 类型的对象,它是一个数组。

而且数组不是指针。简单地说,它们通常被转换为指向表达式中第一个元素的指针。来自 C 标准

3 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.

如果你这样写

int array[10]; 
int *pointer = array;

那么 sizeof( array ) 不等于 sizeof( pointer ) 尽管您可以使用通用语法访问数组的元素:

array[ i ]pointer[ i ] 会得到相同的结果..