【问题标题】:Pointer to arrays syntax指向数组语法的指针
【发布时间】:2015-03-01 04:48:09
【问题描述】:

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

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

代替这种语法:

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

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

【问题讨论】:

  • 数组到指针是一个转换。说数组是指针和说 doubles 是 ints 一样有意义,因为你可以去 int x = 5.5; 。实际上它和 double->int 一样是有损转换,因为你丢失了数组的长度。
  • “我们知道数组本身就是指针” 不不不不不不不不不

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


【解决方案1】:

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

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

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

【讨论】:

  • 因为 &array 的类型实际上是 int (*)[10]。在 C++ 中,你需要一个演员表。在 C 语言中,您可能会通过警告滑过。
  • 另外,它实际上并不是指向指向数组中第一个元素的指针。它仍然指向数组的第一个元素,它只需要两次取消引用即可从中获取一个 int。
  • 您认为“数组本身就是指针”的假设并不完全正确。 实际上完全不正确。
  • @KeithThompson 编辑了。
【解决方案2】:

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

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

所以,给定声明

int array[10];

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

int *ptr = array;

有效。

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

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

【讨论】:

    【解决方案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 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有“类型数组”类型的表达式被转换为 类型为“pointer to type”的表达式,指向初始 数组对象的元素并且不是左值。如果数组对象 有注册存储类,行为未定义。

    如果你写例如

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-02-07
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多