指向数组语法的指针

我有关于指向数组的指针语法的问题。 我们知道数组本身就是指针(我们的教授说的是什么)所以为什么当我们用另一个指针指向它们时(它们是指向指针的指针)我们使用这种语法:

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

而不是这种语法:

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

虽然我知道这是正确的使用malloc但为什么不以正常的方式,它是一个编译器或语法的东西或我错在其他地方?

我们知道数组本身就是指针

不,数组不是指针。 数组是数组。 除非它是sizeof或一元&运算符的操作数,否则“N元素数组T ”的表达式将被转换(“衰减”)为“指向T指针”类型的表达式和expression将是数组的第一个元素的地址。 但是,除了数组元素本身之外,没有为指针留出存储空间。

所以,鉴于声明

 int array[10]; 

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

 int *ptr = array; 

作品。

&array的类型不是 int ** ; 类型是int (*)[10] ,或“指向IO元素数组的指针”。 你将这样的指针声明并初始化为

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

告诉你的教授他们错了。 数组不是指针。 数组可以衰减到指针,但它们不是指针。

int* pointer = array; 声明一个指向array第一个元素的指针。

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

首先是指针的这个定义

 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之后, ++pointer的值将增加sizeof( int )字节。 例如,如果sizeof( int )等于4则指针中的值将增加4

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

同样在第一种情况下取​​消引用指针将为您提供int类型的对象,而在第二种情况下取​​消引用指针将为您提供类型为int[10]的对象,即数组。

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

3除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为”array of type”的表达式转换为类型为”指针的表达式键入”指向数组对象的初始元素,而不是左值。 如果数组对象具有寄存器存储类,则行为未定义。

如果你写的例子

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

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

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