从sizeof(数组名)/sizeof(数组类型) 简单说说 数组名字 和 指针
2013-08-27 20:39
239 查看
数组名本身是个[b]地址常量[/b],但是某些特殊情况下它的语义可以发生改变。例如sizeof(a),这时a表示整个数组对象(这里指语法对象,不是指类的实例)而不是这个常量本身。基于这个 语义,对数组名取地址也是合法的,对于数组a来说&a的结果等于a这个地址常量本身的值。这是 C/C++标准委员会为了维护语法对象a作为一个左值(l-value)总可以取地址这条原则的妥协。
#include<stdio.h> intmain(void) { charstr[]="world"; char*pstr="world"; printf("%d%d",sizeof(str),sizeof(pstr)); getchar(); return0; }
运行结果64。
解释: charstr[]="world"; 这里初始化不限定长度,而"world"包含结束符'\0'后为6个字符,因此初始化str的长度是6;又因为char数组中每个元素(char变量)占用1个字节的空间,所以str[]数组的大小是6字节。 char*pstr="world"; 由于pstr是指针,无论是否指向字符串,指向什么字符串,sizeof(pstr)等于sizeof(int),32位平台上等于4。 造成差别的原因: 这里charstr[]="world";声明并定义了一个数组str[](当然,C语言的语法不允许在定义之外这样引用整个数组,以下这样的写法只是为了区分 语义),之后 标识符str有双重 语义:一是类型为char*const的地址 常量,它的值等于数组中首个元素的地址,即str等价于(char*const)&str[0];二是表示整个str[]数组这个语法对象。在sizeof(str)中,str表示的含义是str[],因此返回整个数组的大小(这个大小在之前的数组定义中已经确定了);而pstr只是个指针,sizeof(pstr)只能返回指针本身占用的字节数而不能确定为它指向的内容分配的空间的大小。 (注意,地址 常量绝不是指针,类型不同!虽然在函数的参数传递过程中,地址 常量可以退化成对应的指针。这里LZ和2L显然由于这个错误理解导致对数组的sizeof()结果判断有误。) 关于数组名 语义规定以及“数组名实际上就表示一个指针( 错的!!!!)”的原因以后需要注意哈···
相关文章推荐
- sizeof关于数组、指针、基本数据类型的使用
- sizeof()函数求类型所占字节大小-指针,数组
- 字符数组,字符指针,Sizeof总结
- [转]内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 数组指针、函数指针和尾置返回类型
- 简单了解PHP编程中数组的指针的使用
- C++中strlen与sizeof处理字符数组和字符指针
- 我的编程学习日志(3)--教你简单的理解数组和指针(对指针概念还模糊的看过来)
- 形参中的数组,实际是一个指针。sizeof为4,其他地方为数组大小
- sizeof(数组名)和sizeof(指针)
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- sizeof在数组和指针中的区别
- Java获取数组组件类型及Array API简单示例
- 初始化:普通数组 vs 指针数组 => sizeof, memset
- sizeof(数组名)和sizeof(指针)
- sizeof() 计算字符型指针数组元素个数时要注意
- sizeof求struct、指针、数组的大小
- 数组、指针与引用类型
- 数据类型 - 数组与指针 (转自万一老师)
- 黑马程序员————C语言基本语法(数组、字符串、指针、其他数据类型)