关于sizeof运算符的一些理解
2009-08-15 22:15
232 查看
作者:朱金灿
来源:http://blog.csdn.net/clever101
CSDN上有网友提问:
这段代码运行结果为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)
(2)
来源:http://blog.csdn.net/clever101
CSDN上有网友提问:
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;
这段代码运行结果为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];
相关文章推荐
- 关于sizeof运算符的一些理解
- 关于sizeof运算符的一些理解
- 关于sizeof的一些理解
- 关于回调函数的一些理解
- LinuxC关于运算符的一些问题
- iPhone开发关于UDID和UUID的一些理解
- 关于指针的一些理解
- 编程技巧干货笔记 【关于一些运算符的效率】
- java关于多态的一些理解
- javascript中关于sort函数的一些理解
- 关于Restful Web Service的一些理解
- 关于sizeof运算符和strlen()函数的个别区别分析
- 关于java反射的一些理解
- 关于sql和mysql对于别名不能调用的一些理解
- 关于++和--运算符的理解
- 关于Bean\Entity\Model\POJO的一些个人理解
- 关于hashcode和equals方法重写的一些理解!
- 关于信息工程一些新的理解
- 关于sizeof和strlen的一些用法
- 关于SAX,DOM,JAXP,JDOM,DOM4J的一些理解