sizeof 是运算符而不是关键字 数组地址和数组首元素地址的不同

95 篇文章 1 订阅

作者:朱金灿
来源:http://blog.csdn.net/clever101
 CSDN上有网友提问:

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
	int *pArray_No1, *pArray_No2, a[] = { 1,2,3,4 };
	pArray_No1 = new int[10];
	pArray_No2 = a;
	cout << sizeof(pArray_No1) << endl        //结果为4 
		 << sizeof(pArray_No2) << endl      //结果为4 
		 << sizeof(a) << endl              //结果为16 
		 << sizeof(&a[0]) << endl;          //结果为4 
	delete[] pArray_No1;
	return 0;
}

这段代码运行结果为4,4,16,4。 
      问(1)为什么pArray_No1初始化为指向10个int型的内存地址块(我的理解没错吧?) 
            而sizeof的运算结果只是1个int型的字节大小,按理来说应该是10个啊,为什么呢? 
      问(2)pArray_No2=a;说明pArray_No2指向了数组a首元素的地址,sizeof(pArray_No2) 
            =4,我理解为编译器只计算了数组a首元素地址的内存空间大小;但是问题出来了,a 代表的肯定是数组a首元素的地址,但是这里sizeof(a)=16,说明编译器计算的不是一个首元素,而是整个数组4个元素的地址占的内存空间。我迷惑了,pArray_No2与a代表的意义相同,但是为什么sizeof的结果却截然不同呢?


MSDN上的解释为: 
The sizeof keyword gives the amount of storage, in bytes, associated with a 
variable or a type (including aggregate types). 
This keyword returns a value of type size_t. 
其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一 
般定义为 
typedef unsigned int size_t;

我觉得理解sizeof运算符的关键在于理解编译期和运行期的区别。静态的数组的大小在编译期就决定了,所以sizeof获取的是数组的大小,而指针动态开辟内存,sizeof不能获取它的开辟的内存的大小,它只能获取指针在该编译器的编译期的大小,在win32平台上无论什么指针的大小都是4个字节。你可以通过编译下面两段代码进行比较分析:

(1)

char a[10];
int b[sizeof(a)];

(2)

	int len = 10;
	int d[len];

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值