我阅读了更多关于C中数组与指针的内容,并编写了以下程序。
#include <stdio.h>
int arr[10] = { } ;
typedef int (*type)[10] ;
int main()
{
type val = &arr ;
printf("Size is %lun", sizeof(val)) ;
printf("Size of int is %lun", sizeof(int)) ;
}
如果我执行这个程序,那么sizeof(val)
被给定为8,sizeof(int)
被给定为4。
如果val
是指向包含10个元素的数组的指针,那么它的大小不应该是40吗。为什么sizeof(val)
是8?
如果val是指向数组的指针
是的,sizeof(val)
为"指向数组的指针"生成大小,而不是数组本身。
。。。它的尺码不应该是40号吗
否,sizeof(val)
计算操作数的大小,即此处的"指针"。在您的平台中,指针的大小似乎是64位,即8字节。因此,它给出了8
。
另外,正如我提到的,使用%zu
打印size_t
,这是由sizeof
运算符生成的类型。
首先初始化数组
int arr[10] = { } ;
在C中无效。您不能在C中使用empty大括号(在C++中允许使用)。你必须写
int arr[10] = { 0 } ;
在C中,相应的初始值设定项是以以下方式定义的
initializer:
{ initializer-list }
{ initializer-list , }
而在C++中
braced-init-list:
{ initializer-list ,opt }
{ }
关于这个声明
printf("Size is %lun", sizeof(val)) ;
则CCD_ 11是指针,因为它具有类似定义的类型CCD_
typedef int (*type)[10] ;
将此声明更改为
printf( "Size is %zun", sizeof( *val ) );
如果您想获得指针指向的对象(即数组)的大小。
sizeof返回指针本身的大小。在64位系统中,它是8个字节。指针不知道它们所指向的缓冲区的大小。
pointer
是一种不同的数据类型,并且总是具有固定大小。将指针想象成一个指向实际数据的符号,并且该符号的大小始终相同——无论它指向的是单个字符还是更大的数组。
val
是指针,其大小相当于系统的地址总线大小。因此,sizeof(val)
或sizeof(anyPointer)
将为您提供8
作为输出。如果您想要40
,请尝试sizeof(arr)
。
指向数组的指针是一个简单的指针,您可以在其中写入val++
,而数组名称是constant pointer
,您不能写入arr++
。
您也可以检查这个链接
很可能您所在的是64 bit
PC,其中内存地址需要64 bits
或8 byte
空间来表示。
现在pointer
实际上保存存储器地址,而它可以保存int
的地址,或者可能保存int[]
的地址,这无关紧要。
所以,当你执行时,
printf("Size is %lun", sizeof(val)) ;
它将CCD_ 29表示为因为指针持有需要CCD_。
和
printf("Size of int is %lun", sizeof(int)) ;
这一行只打印CCD_ 31的大小,即CCD_。