【问题标题】:Is the address of an array equal to its first element in C数组的地址是否等于它在 C 中的第一个元素
【发布时间】:2020-05-23 22:19:29
【问题描述】:

假设这个数组:

int arr[5] = { 1, 2, 3, 4, 5 };

这里arr 有两个用途 - 它是数组的名称,它充当指向数组中第一个元素的指针,因此默认情况下arr 等于&arr[0]

我的问题是,&arr 呢?这也和上面一样吗?

【问题讨论】:

  • 是的,三个的都是一样的。 &arr[0] 的类型和 pointer arr decaying 的类型相同 (int *)。但是&arr的类型不同(int (*)[5])。
  • 类型是什么?
  • 查看更新的评论
  • 所以&arrpointer to the whole array 而不是它的第一个元素?
  • 是的。它是一个 指向 5 个整数数组的指针

标签: c arrays pointers sizeof implicit-conversion


【解决方案1】:

数组实际上是一段内存。所以一个extent的地址就是这个extent中存储的数组和它的第一个元素的地址。

因此,在表达式中使用的数组指示符被转换为指向其第一个元素的指针。

使用您提供的示例

int arr[5] = { 1, 2, 3, 4, 5 };

&arr&arr[0] 这两个表达式具有相同的值但属于不同的类型。

表达式&arr 的类型为int( * )[5],而表达式&a[0] 的类型为int *

这是一个演示程序。

#include <stdio.h>

int main(void) 
{
    int arr[5] = { 1, 2, 3, 4, 5 };

    printf( "&arr == &arr[0] is %s\n", 
            ( void * )&arr == ( void * )&arr[0] ? "true" : "false" );

    printf( "sizeof( *&arr )  = %zu\n", sizeof( *&arr ) );          
    printf( "sizeof( *&arr[0] )  = %zu\n", sizeof( *&arr[0] ) );            
    return 0;
}

它的输出是

&arr == &arr[0] is true
sizeof( *&arr )  = 20
sizeof( *&arr[0] )  = 4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    相关资源
    最近更新 更多