Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么sizeof(*value)返回的值与c+中的sizeof(value)不同+;_C++_Sizeof - Fatal编程技术网

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

我们有:

  • 大小