【问题标题】:Pointer to Array in CC中指向数组的指针
【发布时间】:2017-01-04 21:53:06
【问题描述】:

你如何解释下面这行代码?

int (*arrayABC)[10];

在我的教科书中,它说我们有一个指向整数数组第 0 个元素的指针。

不过,我不太明白。

我的解释:我们有一些变量,它的值是某个地址。该地址就是未命名整数数组的第 0 个元素的地址。基本上我们有一个指向第 0 个元素的指针。

那么为什么要有一个指向指针的指针呢?

【问题讨论】:

  • 诚然,回答您的问题还不够,但是当您在 C 声明方面遇到问题时,Cdecl 始终是一个很好的起点。到底是什么教科书?
  • 请注意,有时有一个指向指针的指针是好的和有用的。然而,正如答案所解释的那样,这不是您的示例中的内容。
  • @FabioTurati 链接可以定制。示例arrayABC as pointer to array 10 of int
  • 您能否留下关于您正在阅读的书的注释并发布确切的报价?所以我们可以将这本书列入黑名单,并在互联网上公开羞辱作者。

标签: c arrays pointers


【解决方案1】:

这是一个指向数组的指针。它不是指向指针的指针。数组和指针是不同的。一个数组一个地址,但是一个数组不是一个地址。数组是一系列连续的元素。

这个指针指向整个数组而不仅仅是第一个元素,就像float * 指向整个浮点数而不仅仅是第一个字节一样。

如果你有例如:

int foo[10];
int (*arrayABC)[10] = &foo;

那么表达式(*arrayABC)foo 是相同的。例如。 foo[3](*arrayABC)[3] 相同。

【讨论】:

  • 所以这个表达式基本上和 int arrayABC[10] 一样,除了我们可以做类似 arrayABC++ 的事情吗?
  • @KevinWu 不,不是这样。 int x[10];int (*x)[10];的区别和float y;float *y;的区别一样
  • 如果我取消引用会发生什么? (做 *arrayABC)
  • @KevinWu 将其添加到我的答案中。您可以以完全相同的方式使用(*arrayABC),并具有与使用它所指向的数组名称相同的行为。
  • @raymai97 是的,写int b[10]; memcpy(b, *arrayABC, sizeof b);。赋值运算符不适用于 C 中的数组,您必须使用 memcpy 或逐个元素的循环分配。
【解决方案2】:

如果你有一个T 类型的对象,那么指向该对象的指针被声明为

T obj;

T *ptr = &obj;

现在让我们将T 类型定义如下

typedef int T[10];

所以上面的代码

T obj;

T *ptr = &obj;

可以使用 typedef 定义重写,如

int obj[10];

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

在这两种情况下,当T 是某种抽象类型并且Tint[10] 的别名时,ptr 是指向对象的指针。在最后一种情况下,ptr 是指向 10 类型为 int 的元素的数组的指针。那就是ptr指向的对象有数组类型。数组和指针是不同的类型。

试试下面的简单演示程序

#include <stdio.h>

int main( void )
{
    typedef int T[10];

    T a;

    T *pa = &a;

    printf( "%zu\n", sizeof( *pa ) );

    int b[10];

    int ( *pb )[10] = &b;

    printf( "%zu\n", sizeof( *pb ) );
}    

它的输出是

40
40

如您所见,这两个值都等于 10 个元素的整数数组的大小。所以指针指向数组。

如果你写

int *arrayABC[10];

您将获得一个包含 10 个 int * 类型的指针的数组。

如果你写

int (*arrayABC)[10];

您将获得一个指向 10 个整数数组的指针。

【讨论】:

    【解决方案3】:

    在我的教科书中,它说我们有一个指向整数数组第 0 个元素的指针。

    你的教科书……措辞很糟糕,我们就这样吧。它是一个指向 int 的 10 元素数组的指针。

    我可以有点看看这本书是从哪里来的。鉴于声明

    int (*a)[10];
    

    表达式*a 将具有int [10] 类型(int 的 10 元素数组)。但是,除非该表达式是sizeof 或一元&amp; 运算符的操作数,否则它将从int [10] 类型转换(“衰减”)为int *,表达式的值将是数组的第一个元素:

    Expression       Type        "Decays" to        Value
    ----------       ----        -----------        -----
            *a       int [10]    int *              Address of first element of the array;
                                                    equivalent to `&(*a)[0]`.  
    

    因此,如果我调用类似的函数

    foo( *a );
    

    函数实际接收将是指向指向数组的第一个元素的指针(其类型将是int *,而不是int **)。

    所以实际上,是的,a 经常以表现一个指向数组第一个元素的指针的指针结束;但是,它的 typenot “指向int 的指针”,并且类型很重要。给定:

    int (*a)[10];
    int **b;
    

    那么您将获得以下不同的行为:

    sizeof *a vs. sizeof *b
    a + i vs b + i (also applies to a++ vs b++)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2013-04-19
      • 2023-03-11
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多