C++ 为什么sizeof(*value)返回的值与c+中的sizeof(value)不同+;
我对这个很好奇:C++ 为什么sizeof(*value)返回的值与c+中的sizeof(value)不同+;,c++,sizeof,C++,Sizeof,我对这个很好奇: int main() { int a[7]; std::cout << "Length of array = " << (sizeof(a)/sizeof(*a)) << " - " << sizeof(a) << " - " << sizeof(*a) << std::endl; } 所以我的问题是:为什么我必须使用
int main()
{
int a[7];
std::cout << "Length of array = " << (sizeof(a)/sizeof(*a)) << " - " << sizeof(a) << " - " << sizeof(*a) << std::endl;
}
所以我的问题是:为什么我必须使用
(sizeof(a)/sizeof(*a))
来接收正确的大小,为什么sizeof(*a)
返回4
,而sizeof(a)
返回28
?数组的名称衰减为指向第一个元素的指针
*a == a[0]
*(1+a) == a[1]
等等
整数指针的长度是4字节,就像int变量一样
另一方面,
a
数组是长度为7的整数数组,因此总大小为7*4=28
数组的名称衰减为指向第一个元素的指针
*a == a[0]
*(1+a) == a[1]
等等
整数指针的长度是4字节,就像int变量一样
另一方面,a
数组是长度为7的整数数组,因此总大小为7*4=28
sizeof(a)
返回28
,因为数组中有7个元素,每个元素的长度为4字节
sizeof(*a)
返回4
,因为*a
取消对数组中第一个长度为4字节的元素(整数)的引用
因此,sizeof(a)/sizeof(*a)==28/4==7
编辑:
你不应该养成在C++中这样找到数组长度的习惯。最好保留另一个存储数组长度的变量sizeof
是在编译时使用固定长度数组计算的。如果在可变长度数组上调用sizeof
,它通常会返回8,因为这是指针的大小(在64位系统上)。有关此操作的详细信息,请参阅。sizeof(a)
返回28
,因为数组中有7个元素,每个元素的长度为4字节
sizeof(*a)
返回4
,因为*a
取消对数组中第一个长度为4字节的元素(整数)的引用
因此,sizeof(a)/sizeof(*a)==28/4==7
编辑:
你不应该养成在C++中这样找到数组长度的习惯。最好保留另一个存储数组长度的变量
sizeof
是在编译时使用固定长度数组计算的。如果在可变长度数组上调用sizeof
,它通常会返回8,因为这是指针的大小(在64位系统上)。有关这方面的更多信息,请参阅。当指针传递给函数、用于运算符或以任何方式与变量类似时,指针会衰减为指针<代码>*a
是指衰减指针指向的内容。换句话说,a
衰减为一个int*
,它指向a
中的第一个值,而*a
是一个int
,这就是为什么sizeof
返回两种数据类型的不同大小的原因。a
在传递给一个函数时衰减为指针,在运算符中使用,或者在任何方面都像变量一样使用<代码>*a是指衰减指针指向的内容。换句话说,a
衰减为一个int*
,它指向a
中的第一个值,而*a
是一个int
,这就是sizeof
返回两种数据类型的不同大小的原因。通过语句inta[7]
,您正在声明一个大小为7的整数数组(此处只能存储7个整数元素)。
如果使用语句sizeof(a)
,则得到a的大小。您可能知道,它是7x4
(为什么是4?因为整数的大小是4字节)。因此,如果需要得到数组的实际大小(即元素数),则必须将其除以int
为什么我必须使用(sizeof(a)/sizeof(*a))
来接收正确的大小,为什么sizeof(*a)
返回4,而sizeof(a)
返回28
要回答这个问题,您必须知道数组名实际上是指向数组第一个元素的指针(即,在本例中,它指向a[0]
),那么a[0]
是什么?它是一个整数,对吗?您可以将sizeof(*a)
看作sizeof(int)
。
由于sizeof(int)
返回4
,因此sizeof(*a)
也将返回。
得到7(正确答案)的原因是:
sizeof(a)=7*4,
因此,sizeof(*a)=4
(sizeof(a)/sizeof(*a))=7
通过语句inta[7]
,您正在声明一个大小为7的整数数组(此处只能存储7个整数元素)。
如果使用语句sizeof(a)
,则得到a的大小。您可能知道,它是7x4
(为什么是4?因为整数的大小是4字节)。因此,如果需要得到数组的实际大小(即元素数),则必须将其除以int
为什么我必须使用(sizeof(a)/sizeof(*a))
来接收正确的大小,为什么sizeof(*a)
返回4,而sizeof(a)
返回28
要回答这个问题,您必须知道数组名实际上是指向数组第一个元素的指针(即,在本例中,它指向a[0]
),那么a[0]
是什么?它是一个整数,对吗?您可以将sizeof(*a)
看作sizeof(int)
。
由于sizeof(int)
返回4
,因此sizeof(*a)
也将返回。
得到7(正确答案)的原因是:
sizeof(a)=7*4,
因此,sizeof(*a)=4
(sizeof(a)/sizeof(*a))=7
a
,和*a
有不同的类型;int[7]
和int
分别(忽略可能的参考值作为l值)
我们有:
大小