指向数组语法的指针

时间:2015-03-01 04:48:10

标签: c++ c arrays pointers pointer-to-pointer

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

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

而不是这种语法:

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

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

3 个答案:

答案 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元素数组;除非arraysizeof或一元&的操作数,否则它将衰减为int *类型。所以

int *ptr = array;

的工作原理。

&array的类型 int **;类型为int (*)[10],或"指向{-1}}"的10元素数组的指针。您将这样的指针声明并初始化为

int