c语言 数组中的sizeof()
2016-07-23 10:32
337 查看
MSDN上sizeof的解释:Thesizeof operator gives the amount of storage, in bytes, required to store
an object of the type of the operand(sizeof运算给出的存储量,以字节为单位来存储操作数的类型的对象必需的。)
简单的说其实sizeof()的作用:返回一个对象或者类型所占的内存字节数。
float
4 个字节 double 8个字节
short
2 个字节 long 4个字节
long
long 8个字节
指针:
指针是来存放地址的,那么它当然等于计算机内部地址总线的宽度。在32位计算机中,一个指针变量的返回值必定是4个字节。指针变量的sizeof值与指针所指的对象没有任何关系。
实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的
不同对象其sizeof值都是一致的。这里,对象可以进一步延伸至表达式,即sizeof可以
对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式
进行计算。如:
sizeof( 2 );// 2的类型为int,所以等价于 sizeof( int );
sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价于 sizeof( double );
不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
文章的重点内容来了
: 数组中的 sizeof()
数组的sizeof值等于数组所占用的内存字节数。 :
注意::不可以在自定义函数(带数组参数)中用sizeof 求数组的大小
在所有使用数组名的表达式中,数组名的值是一个指针常量(注意不是指针变量),也就是数组第1个元素的地址。
在两种情况下,数组名不用指针常量来表示(表示整个数组的地址)——当数组名作为sizeof操作符或单目操作符&的操作数。
一维数组:
二维数组 :
数组名表示整个数组: 只有在sizeof 中单独使用 或者和&操作符使用
数组名参与运算要发生降级 比如说a[0] a[1]也表示数组名 ,此时表现为一维数组
an object of the type of the operand(sizeof运算给出的存储量,以字节为单位来存储操作数的类型的对象必需的。)
简单的说其实sizeof()的作用:返回一个对象或者类型所占的内存字节数。
float
4 个字节 double 8个字节
short
2 个字节 long 4个字节
long
long 8个字节
指针:
指针是来存放地址的,那么它当然等于计算机内部地址总线的宽度。在32位计算机中,一个指针变量的返回值必定是4个字节。指针变量的sizeof值与指针所指的对象没有任何关系。
实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的
不同对象其sizeof值都是一致的。这里,对象可以进一步延伸至表达式,即sizeof可以
对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式
进行计算。如:
sizeof( 2 );// 2的类型为int,所以等价于 sizeof( int );
sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价于 sizeof( double );
不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
<span style="font-size:18px;"><span style="font-size:14px;">void fun1() { } int fun() { return 1; } struct F { unsigned int f1 : 1; int na; }; int main() { printf("%d",sizeof(fun)); //错误 sizeof 的操作数不能是函数 printf("%d", sizeof(fun())); //正确 输出 4 printf("%d", sizeof(fun1())); //错误 不允许使用不完整的类型 printf("%d", sizeof(F.na)); //错误 未定义的标示符"F" system("pause"); return 0; }</span></span>
文章的重点内容来了
: 数组中的 sizeof()
数组的sizeof值等于数组所占用的内存字节数。 :
注意::不可以在自定义函数(带数组参数)中用sizeof 求数组的大小
在所有使用数组名的表达式中,数组名的值是一个指针常量(注意不是指针变量),也就是数组第1个元素的地址。
在两种情况下,数组名不用指针常量来表示(表示整个数组的地址)——当数组名作为sizeof操作符或单目操作符&的操作数。
一维数组:
<span style="font-size:18px;">// 数组名表示整个数组: 只有在sizeof 中单独使用 与 &操作符使用 char a[4] = {'1','2','3','4'}; printf("%d\n",sizeof(a)); // 4 a代表整个数组 , 数据类型char 的大小* 数组大小 printf("%d\n", sizeof(a+0)); // 4 a降级使用 表示首元素的地址, 地址 的大小 就是4 个字节 printf("%d\n", sizeof(*a)); // 1 a降级使用 表示首元素的地址 *解引用 表示第一个元素‘1’ printf("%d\n", sizeof(a+1)); // 4 a降级使用 表示首元素的地址, +1表示以前面的标准(一个元素) // <span style="font-size:24px;"><span style="font-family:SimSun"></span></span> // 向后移一位 此时表示第二个元素的地址地址的大小就是4 个字节 <span style="font-size:24px;"><span style="font-family:SimSun"></span></span> printf("%d\n", sizeof(a[1])); // 1 表示第一个元素‘1’ char类型 所以 大小为1 printf("%d\n", sizeof(&a)); // 4 &表示取地址 相当于指针 所以大小为4 // 注意: 此时 a 表示整个数组 ,所以 此时的地址为整个数组的地址 printf("%d\n", sizeof(&a+1)); // 4 此时 a 表示整个数组 ,&a 表示整个数组的地址 // +1 表示以前面的标准(整个数组) 向后移一位,此时地址为下一个数组的地址 printf("%d\n", sizeof(&a[0])); // 4 表示第一个元素的地址 printf("%d\n", sizeof(&a[0]+1)); // 4 +1 表示以前面的标准(一个元素) 向后移一位 //此时表示第二个元素的地址</span>
二维数组 :
数组名表示整个数组: 只有在sizeof 中单独使用 或者和&操作符使用
数组名参与运算要发生降级 比如说a[0] a[1]也表示数组名 ,此时表现为一维数组
<span style="font-size:18px;"> // 数组名表示整个数组:只有在sizeof 中单独使用 或者 和&操作符使用 // 数组名参与运算要发生降级 比如说a[0] a[1] 也表示数组名 char a[2][3] = { '1','2','3','4','5','6',}; printf("%d\n",sizeof(a)); // 6 a表示整个数组 大小为 6 printf("%d\n", sizeof(a+1)); // 4 a参与运算 降级使用 表示第一行的地址, <span style="font-size:24px;"><span style="font-family:SimSun"></span></span> <span id="transmark"></span>// +1表示以前面的标准(一行元素)向后移一位so表示第二行的元素的地址 <span style="font-size:24px;"><span style="font-family:SimSun"></span></span> printf("%d\n",sizeof(a[0])); // 3 a[0] 表示第一行 相当于一位数组的数组名 printf("%d\n",sizeof(a[0]+1)); // 4 a[0]参与运算 降级使用成为a[0][0] // +1表示以前面的标准(一个元素) 向后移一位 所以表示a[0][1]的地址 printf("%d\n",sizeof(&a[0]+1)); // 4 &a[0] 表示第一行的地址 // +1表示以前面的标准(一行元素)向后移一位所以表示为第二行的地址 printf("%d\n",sizeof(*a)); // 3 a参与运算 降级使用 成为 第一行 的地址 // *解引用表示第一行(三个元素) 的大小 所以为3 printf("%d\n",sizeof(a[2])); // 3 a[2] 越界但是不影响 <span id="transmark"></span>相当于一维数组的数组名 表示第三行的大小 </span><span id="transmark"></span>
相关文章推荐
- c++ std:: advance
- C/C++ 中fopen_s与fopen
- NYOJ 23取石子问题(巴什博弈)
- C++ virtual函数 实现机制
- C++、Visual C++、MFC(编译和封装)之间的关系是什么?
- 使用QProxyStyle定制QMenu (二)
- sprintf和sscanf的用法
- C++软件添加dump调试打印日志(推荐)
- C语言实现ping功能(查看设备联网状态)
- C语言中字符串的赋值
- C++重载函数 const形参 引用指针 const_cast
- 继承
- 【C++11】C++11新增的便利算法[1] all_of、any_of 和 none_of
- 李洪强漫谈iOS开发[C语言-017]-printf函数
- c语言程序结构,全局变量,局部变量
- 李洪强漫谈iOS开发[C语言-016]-变量的作用域
- C语言学习-结构体
- 李洪强漫谈iOS开发[C语言-015]-变量的使用
- C语言基础知识
- 合并两个排序的链表 C++