我对指向数组的指针的语法有疑问。 我们知道数组本身是指针(我们的教授说的是什么)所以当我们用另一个指针指向它们时(为指针的指针)我们使用这种语法:
int array[10];
int *pointer = array;
而不是这种语法:
int array[10];
int **pointer = &array;
虽然我知道使用malloc这是正确的,但为什么不以正常的方式,它是编译器或语法的东西还是我在其他地方错了?
答案 0 :(得分:4)
告诉你的教授他们错了。数组不是指针。数组可以decay指针,但 不是指针。
int* pointer = array;
声明指向array
中第一个元素的指针。
int** pointer = &array;
不正确。正如评论中jschultz410所提到的,&array
的类型不是 int**
,它是int (*)[10]
又是指向10的数组的指针整数,不能衰减到int**
。
答案 1 :(得分:3)
首先这个指针的定义
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除非它是sizeof运算符或一元&的操作数。 operator,或者是用于初始化数组的字符串文字,a 具有类型''数组类型''的表达式将转换为 带有''指向类型'的指针的表达式,指向初始值 数组对象的元素,而不是左值。如果是数组对象 具有寄存器存储类,行为未定义。
如果你写的是
int array[10];
int *pointer = array;
然后sizeof( array )
不等于sizeof( pointer )
,尽管您可以使用通用语法来访问数组的元素:
array[ i ]
和pointer[ i ]
并会得到相同的结果..
答案 2 :(得分:2)
我们知道数组本身就是指针
没有。数组不是指针。数组是数组。除非它是sizeof
或一元&
运算符的操作数,否则表达式的类型为" N元素数组T
&# 34;将被转换("衰变")到类型为#34的表达式;指向T
"并且表达式的值将是数组的第一个元素的地址。但是,除了数组元素本身之外,没有为指针留出存储空间。
所以,鉴于声明
int array[10];
表达式array
的类型是" int
"的10元素数组;除非array
是sizeof
或一元&
的操作数,否则它将衰减为int *
类型。所以
int *ptr = array;
的工作原理。
&array
的类型不 int **
;类型为int (*)[10]
,或"指向{-1}}"的10元素数组的指针。您将这样的指针声明并初始化为
int