Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C `a`和`*a`之间有什么区别,其中`a`表示二维数组?_C_Arrays_Pointers_Multidimensional Array_Syntax - Fatal编程技术网

C `a`和`*a`之间有什么区别,其中`a`表示二维数组?

C `a`和`*a`之间有什么区别,其中`a`表示二维数组?,c,arrays,pointers,multidimensional-array,syntax,C,Arrays,Pointers,Multidimensional Array,Syntax,指针和数组彼此密切相关,因此,如果我们有一个二维数组 int a[3][4]={ 1,2,3,4, 5,6,7,8, 9,10,11,12}; 两者 及 打印相同的地址。我所理解的可能是a指向a的基址,而*a指向二维数组a的第一个子数组 那么,两者的区别是什么呢 我得到的可能是a指向了一段时间的基址*a 指向二维数组a的第一个子数组 差不多了 a当您将其传递给printf时,它自身会衰减为指向其第一个子数组的指针(

指针和数组彼此密切相关,因此,如果我们有一个二维数组

int a[3][4]={
             1,2,3,4,
             5,6,7,8,
             9,10,11,12};
两者

打印相同的地址。我所理解的可能是
a
指向
a
的基址,而
*a
指向二维数组
a
的第一个子数组

那么,两者的区别是什么呢

我得到的可能是a指向了一段时间的基址*a 指向二维数组a的第一个子数组

差不多了

  • a
    当您将其传递给
    printf
    时,它自身会衰减为指向其第一个子数组的指针(类型为
    int(*)[3]
  • *a
    指定
    a
    的第一个子数组(类型为
    int[3]
    ),并衰减到指向该子数组第一个元素的指针(类型为
    int*

最后,它们共享相同的值,因为数组递归地与第一个元素具有相同的地址。

指针(数组衰减到)之间的差异不是地址而是类型

正如您所看到的,两个指针都指向相同的地址。但是
a
指向子数组,而
*a
指向
int
s


这会产生不同,例如在执行地址算术时
a+1
不同于
*a+1

它非常简单
*a
是一个整数数组。在您的情况下,除了数组
[1,2,3,4]
中的
*a
。可以通过
(*a)[i]
访问此数组的各个元素,其中
i
是所需元素的索引

a
是指向这个整数数组的指针
a[0]
将为您提供第一个数组(与
*a
相同),
a[1]
将为您提供第二个数组(即
[5,6,7,8]


例如,如果您想访问第5个元素(即
5
),它将
a[1][0]

a
是一个大小为3x4的二维数组。这意味着:

  • sizeof(a)==3*4*sizeof(int)
  • a[i]
    是一个大小为4的1D数组(对于给定声明的0)

    int a[3][4];
    
    以下是事实:

    Expression     Type            Decays to        Value
    ----------     ----            ---------        -----
             a     int [3][4]      int (*)[4]       Base address of array
            &a     int (*)[3][4]   n/a              Base address of array
            *a     int [4]         int *            Base address of first subarray
                                                    (equivalent to a[0])
          a[i]     int [4]         int *            Base address of i'th subarray
         &a[i]     int (*)[4]      n/a              Base address of i'th subarray
         *a[i]     int             n/a              Value of a[i][0]
       a[i][j]     int             n/a              Value of a[i][j]
      &a[i][j]     int *           n/a              Address of a[i][j]
    
    数组的第一个元素的地址与数组本身的地址相同,因此表达式
    a
    &a
    *a
    a[0]
    &a[0]
    &a[0][0]
    都会产生相同的值(数组的第一个元素的地址),但它们的类型不同(
    int(*)[3][4]
    vs.
    int(*)[4]
    vs.
    int*

    编辑

    除非它是
    sizeof
    或一元
    &
    运算符的操作数,否则“T的N元素数组”类型的表达式将转换(“衰减”)为“指向
    T
    的指针”类型的表达式,表达式的值将是数组第一个元素的地址

    因此表达式
    *a
    相当于
    a[0]
    ;这两个表达式都具有类型“int的4元素数组”。由于它们不是
    大小的
    或一元
    &
    运算符的操作数,因此这些表达式“衰减”为类型“指向
    int
    的指针”

    这就是“衰变为”一栏所显示的


    请参阅的第6.3.2.1节。

    当我们需要访问数组rt的不同元素时,可能会出现差异?将
    sizeof(a)
    sizeof(*a)
    进行比较。当您将其传递给printf时,a自身会衰减为指向其第一个子数组的指针?我没有得到这一点。问题是“它们的差异是什么?”而不是“a
    和a
    如何指向同一位置?”@rohistaluja数组名称(例如
    a
    )衰减到除少数上下文外的所有上下文中指向其第一个元素的指针。函数调用参数是一个衰减的上下文。@CoolGuy比较
    a
    *a
    的两个项目符号如何不能回答问题?对我来说,这两个项目符号说的是相同的事情,但方式不同。您已经解释了相似性,而不是dif引用。我只是想知道它的类型。所以,
    a
    int(*)类型,
    *a
    int*
    ,对吗?@CoolGuy…衰减后;)a是int()类型而*a是一个int,所以a是一个指向数组的指针,就像我们有指向整数的指针一样?如果是,那么为什么我们需要使用指向数组的指针?最后一句不清楚。你能检查一下语法吗?“它本身衰减为&a[0][0]--你确定吗?这意味着
    a+1
    *a+1
    是相同的。它们不是。我们如何才能在这里看到POIMTER的类型?@rohitaluja:对于数组,它在“Decays to”列中。对于指针,它在“type”列中我知道虽然它们指向同一个地址,但它们是不同的,但从上面的类型中,我只能得到一个int[4]类型,所以它就像指向数组的指针,但我无法理解其他类型的指针的行为。你能提供一个与指针和多维数组相关的源材料,以便我理解它吗well@John谢谢你的消息来源,但我还不习惯理解这些标准文件。如果你能解释一下,我会很有帮助的n更简单的语言:)@rohistaluja:这是最简单的。当数组表达式如
    a
    (3x4数组的
    int
    )或
    *a
    (4元素数组的
    int
    )出现在代码中时,它们将被替换为指针表达式,其值为第一个元素的地址,除非表达式是
    sizeof
    或一元
    &
    运算符的操作数。
    int a[3][4];
    
    Expression     Type            Decays to        Value
    ----------     ----            ---------        -----
             a     int [3][4]      int (*)[4]       Base address of array
            &a     int (*)[3][4]   n/a              Base address of array
            *a     int [4]         int *            Base address of first subarray
                                                    (equivalent to a[0])
          a[i]     int [4]         int *            Base address of i'th subarray
         &a[i]     int (*)[4]      n/a              Base address of i'th subarray
         *a[i]     int             n/a              Value of a[i][0]
       a[i][j]     int             n/a              Value of a[i][j]
      &a[i][j]     int *           n/a              Address of a[i][j]