【问题标题】:How is pointer to array different from array names?指向数组的指针与数组名称有何不同?
【发布时间】:2015-09-11 17:29:32
【问题描述】:

我正在阅读有关 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 ?

【问题讨论】:

  • 使用%zu打印sizeof

标签: c arrays pointers sizeof pointer-to-array


【解决方案1】:

如果 val 是指向数组的指针...

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

...大小不应该是 40 吗?

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

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

【讨论】:

  • 如果是这样,那么类型 int () [10] 和类型 int 有什么区别? .它们有何不同?
  • @ps06756 或许this的回答能帮您解开疑惑?
  • @ps06756 int(*)[10] 表示指向 10 个 ints 数组的指针,而 int* 只是指向 int 的指针。
  • @CoolGuy...(只是为了完成你的句子)..但是,仍然,两个都是指针.
  • @ps06756 你在你的问题中写了sizeof(int),这不是一个指针。你的意思是sizeof(int *)??
【解决方案2】:

首先是数组的初始化

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 ) ); 

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

【讨论】:

  • 早上好,先生!关于您的第一个陈述,您能否确认 c99 中的空初始化程序也无效?我确定 ISO C 禁止它,但对 c99 不太确定,你能确认一下吗?
  • @SouravGhosh 使用搜索并找到这个答案,SO上有很多。如果这让您感到困扰,您可以更新答案。
  • @Sourav Ghosh 你好吗,先生。:) 请查看我更新的帖子。
  • @SouravGhosh 在 C 中从未允许使用空声明列表。在标准的每个版本中,语法始终相同。
【解决方案3】:

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

【讨论】:

  • 如果是这样,那么数据类型 int () [10] 和 int 有什么区别?
【解决方案4】:

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

【讨论】:

  • 如果是这种情况,那么类型 int () [10] 和 int 有什么区别?
【解决方案5】:

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

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

您也可以查看link

【讨论】:

    【解决方案6】:

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

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

    所以,当你执行时,

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

    它显示8 是因为指针包含需要64 bits 空间的地址。

    还有

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2017-09-03
      相关资源
      最近更新 更多