指向数组的指针与数组名称有何不同?

How is pointer to array different from array names?

我阅读了更多有关 C 中数组与指针的信息,并编写了以下程序。

#include <stdio.h> 

int arr[10] = { } ; 
typedef int (*type)[10]  ;
int main()
{
   type val = &arr ; 
   printf("Size is %lu\n", sizeof(val)) ; 
   printf("Size of int is %lu\n", sizeof(int)) ;
}

如果,我执行这个程序,那么sizeof(val)给8,sizeof(int)给4。

如果 val 是指向包含 10 个元素的数组的指针,它的大小不应该是 40。为什么 sizeof(val) 是 8?

If val is a pointer to the array...

是的,sizeof(val) 生成“指向数组的指针”的大小,而不是数组本身。

...shouldn't it's size be 40.?

不是,sizeof(val)计算操作数的大小,这里的"pointer"。在您的平台中,指针的大小似乎是 64 位,即 8 个字节。所以,它给出 8.

此外,正如我提到的,使用 %zu 打印 size_t,由 sizeof 运算符生成的类型。

sizeof returns 指针本身的大小。在 64 位系统中为 8 个字节。 指针不知道它们指向的缓冲区的大小。

A pointer 是一种独特的数据类型,并且始终具有固定大小。将指针视为指向实际数据的符号,并且符号始终具有相同的大小 - 无论它指向单个字符还是更大的数组。

val是指针,其大小相当于系统的地址总线大小。 所以,sizeof(val)sizeof(anyPointer) 会给你 8 作为输出。 如果你想要 40 然后尝试 sizeof(arr).

指向数组的指针是简单的指针,您可以在其中写 val++ 而数组名称是 constant pointer 您不能写 arr++.

你也可以查看这个link

首先初始化一个数组

int arr[10] = { } ; 

在 C 中无效。您不能在 C 中使用空大括号(在 C++ 中是允许的)。你必须写

int arr[10] = { 0 } ; 

在C中对应的初始化器定义如下

initializer:
    { initializer-list }
    { initializer-list , }

在 C++ 中

braced-init-list:
    { initializer-list ,opt }
    { }

至于这个说法

printf("Size is %lu\n", sizeof(val)) ; 

那么 val 是一个指针,因为它的类型 type 定义为

typedef int (*type)[10]  ;

将此语句更改为

printf( "Size is %zu\n",  sizeof( *val ) ); 

如果你想得到指针指向的对象(即数组)的大小。

很可能您在 64 bit PC 中,内存地址需要 64 bits8 byte space 来表示。

现在 pointer 实际上保存的是内存地址,而它可能保存的是 int 或者可能是 int[] 的地址,没关系。

所以,当你执行时,

printf("Size is %lu\n", sizeof(val)) ; 

它显示 8 因为指针保存需要 64 bits space.

的地址

printf("Size of int is %lu\n", sizeof(int)) ;

这一行只打印 int 的大小,即 4 字节。