sizeof的定义:

sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。

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.

sizeof关键字提供与变量或类型(包括聚合类型)关联的存储量(以字节为单位)。此关键字返回一个size_t类型的值。看到返回,但不要认为这是一个函数。

对于sizeof的理解,sizeof:

首先是一个关键字,也是一个操作符,而非函数。

其次求长度,返回一个对象或者类型所占的内存字节数。

总结一下:sizeof更像一个特殊的宏,它是在编译阶段求值的。不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。

sizeof(数组),结果是数组所占的空间大小;

sizeof(指针),结果又是什么呢? sizeof(指针),其结果和操作系统有关,32位操作系统返回值4,64位操作系统返回值8。

再来理解这句话:sizeof求长度,返回一个对象或者类型所占的内存字节数。那么sizeof(指针),就是返回指针在内存中占用空间大小;

接着在问一个问题,不同的指针在操作系统中占用的空间大小是一样的吗?答案是肯定的,不同的指针类型在操作系统中占用的空间大小是一样的。

在写代码时,还会遇到对一个常量字符串求长度,例如:对123456字符串求长度,

printf("sizeof(123456)=%d\n", sizeof("123456"));

这个打印结果是7,是否超出了你的预期。对于sizeof("xxx"),对于""中的字符串,sizeof操作求长度,默认后面还有一个\0,所以实际的长度要+1。

printf("sizeof(1+1.2)=%d\n", sizeof(1+1.2));

这个打印结果是8,是否又超出了你的预期。

sizeof(express),其中的express在编译过程中是不会被编译的,而是被替代类型。

例如: int a = 1; sizeof(a=2);

此时的express为a=2,在编译过程中被替换为sizeof(int),所以在执行完之后,a仍然是等于1。

所以sizeof(1+1.2) 在编译过程中被替换成double类型的,double占8个字节。

用一个程序来验证一下:

#include <stdlib.h>
#include <stdio.h>typedef struct
{int a;char buf[20];
}Node_t;int get_array_point_size(int *data)
{printf("\narray pointer size %d\n", sizeof(data));return 0;
}int main()
{char *q=NULL;float *f=NULL;Node_t *node =NULL;int a[5]={1,2,3,4,5};int *p=a;printf("p = %p\n",p);int *ptr = (int *)(&a+1);printf("ptr=%p\n",ptr);printf("%d   %d\n",*(a+1),*(ptr-1));printf("sizeof(ptr-1) = %d\n",sizeof(ptr-1));printf("sizeof(q)=%d\n", sizeof(q));printf("sizeof(f)=%d\n", sizeof(f));printf("sizeof(node)=%d\n\n", sizeof(node));printf("sizeof(a)=%d\n", sizeof(a));printf("sizeof(*q)=%d\n", sizeof(*q));printf("sizeof(*f)=%d\n", sizeof(*f));printf("sizeof(*node)=%d\n", sizeof(*node));printf("sizeof(123456)=%d\n", sizeof("123456"));get_array_point_size(a);return 0;
}//运行结果
root@ubuntu140453200:/mnt/external/root/test/linux_c$ ./sizeof_1
p  =0x7ffd7485fa10
ptr=0x7ffd7485fa24
2   5
sizeof(ptr-1)=8
sizeof(q)=8
sizeof(f)=8
sizeof(nood)=8sizeof(a)=20
sizeof(*q)=1
sizeof(*f)=4
sizeof(*nood)=24
sizeof(123456)=7array pointer size 8
root@ubuntu140453200:/mnt/external/root/test/linux_c$

补充说明,32位编译器,64位编译器的对数据类型的大小定义不一样。

各位看官,看到这里可能有一个问题,如果是数组作为参数传入到函数,那么这个数组在函数内部进行sizeof求长度结果是什么? 结果也是8个字节。

这里面有一段指针的内容:

    int a[5]={1,2,3,4,5};int *p=a;printf("p = %p\n",p);int *ptr = (int *)(&a+1);printf("ptr=%p\n",ptr);printf("%d   %d\n",*(a+1),*(ptr-1));printf("sizeof(ptr-1) = %d\n",sizeof(ptr-1));

下面来讲一下这个指针:

int a[5] = {1, 2, 3, 4, 5}; 表示 a 是一个数组,里面有五个成员;

a 表示这个数组的首地址,

a[0] 表示数组的第一个元素,

&a 表示对数组的首地址进行取址操作,这个操作其实是二维操作,将 a 看做一个二维数组,即 a[][5],相当于a[0]

&a + 1  表示将数组a,看做一个二维数组,&a 表示二维数组的第一维度的首地址,&a + 1 表示第一维度的第二组的首地址,即 a[][5], 相当于 a[1]

ptr = (int *)(&a + 1) 表示将 ptr 指向了二维数组的 a[1], 把 a 看做一个二维数组。但是这个访问是非法的,产生越界了。如果直接访问ptr的内容,程序会挂掉。

(ptr - 1) 表示的就是 a[1][0] - 1 减去一个数组成员,即a[0][5],这个访问是合法的

所以最后打印的结果就是:

p  =0x7ffd7485fa10
ptr=0x7ffd7485fa24
2   5

sizeof 数组与指针相关推荐

  1. C/C++:sizeof数组与指针

    C/C++:sizeof数组与指针 在C/C++中使用sizeof对数组和指针所得的结果是不一样的. [例1] #include <stdio.h> #include <stdlib ...

  2. c/C++计算int / int *数组的长度;sizeof(指针),sizeof(数组名)的区别

    1.计算int *数组长度: int arrayVlenth(float *p) {int len = 0;while (*p){p++;len++;}return len; } sizeof(指针) ...

  3. [cpp] 字符数组,字符指针,sizeof,strlen总结

    对于字符数组与字符指针: 1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0". ...

  4. 计算结构体、数组、指针的sizeof

    1. 结构体的sizeof 题目: sturct aa { in num; char name[10]; }; struct bb { int a; float b; struct aa c; }; ...

  5. C++/C中 sizeof(指针)和sizeof(数组名)的区别

    1.sizeof(array)/sizeof(int)的含义 array是个数组 sizeof (array)就是这个数组所占的内存总量(字节数), sizeof(int)就是单个所占的内存. 所以呢 ...

  6. 面试准备每日五题:C++(六)——CC++、staticconstextern、sizeof strlen、指针引用、数组指针指针数组函数指针

    文章目录 一.C和C++的区别是什么? 二.关键字static.const.extern作用 三.sizeof和strlen的区别 四.指针和引用的区别 五 .指针数组.数组指针.函数指针 一.C和C ...

  7. 数组和指针(sizeof两者的关系)

    <c和指针>还有对其他博客的参考 数组很常见,int b[4]中 b[4]是整形,b类型是什么呢? 正常思考方式,b应该是表示整个数组,但是我们使用数组名字b的过程中,几乎所有都是一个指针 ...

  8. sizeof与数组和指针

    sizeof与数组和指针 1.sizeof()的作用是输出操作数或对象占用的空间量(字节数). 2.sizeof是运算符,并不是函数,()并不是必须的,他只是表示优先级. 3.当sizeof的对象是表 ...

  9. c++ char数组初始化_c专题指针数组与指针的关联

    ----在今天开始写文章之前,让我不由的想起高中里面学的一篇文章中一段话语,是荀子写的<劝学>:积土成山,风雨兴焉:积水成渊,蛟龙生焉:积善成德,而神明自得,圣心备焉.故不积跬步,无以至千 ...

最新文章

  1. 获取VirtualBox COM对象失败,Unable to start the virtual device
  2. C/C++之预处理命令
  3. java 二维数组_Java中二维数组和异常的内容及应用
  4. Memcached Client 使用手册
  5. 【转】log4net使用详解
  6. java 自定义注释_带有自定义注释的Java注释教程
  7. [你必须知道的.NET] 第六回:深入浅出关键字---base和this
  8. 浅谈Java的数据结构
  9. 非阻塞式JavaScript脚本介绍
  10. Boosting GDBT
  11. Windows系统 services.msc命令详解,Windows命令行查看本地服务
  12. spark线性svm支持向量机 小结
  13. skynet启动读取配置文件浅析(skynet_main.c)
  14. 计算机科学与技术专接本的历年真题,10年计算机专业专接本真题
  15. 2022秋招面经(C++软开)
  16. ArcMAP栅格数据裁剪小技巧
  17. 系统研发类项目标书制作流程--标书该怎么做?
  18. 概率论 —— 条件数学期望
  19. 关于微信群的一个新玩法 (月末总结)
  20. ensp WLAN二层零漫游

热门文章

  1. 2012服务器系统怎么样设启动项,Windows2012开机启动项设置
  2. Unity快速入门之一 3D基础概念、Camera、Canvas RenderMode的几种方式对比
  3. Proteus8.9 安装教程、闪退问题解决
  4. ORA-01034和ORA-27101的解决办法
  5. pywinauto模块 窗口自动化操作相关
  6. 爬知网验证码图片踩坑记录
  7. Android 学习方法
  8. 在广州传智播客网页平面UI设计培训机构能学到什么?
  9. 解决ERROR - unregister mbean error javax.management.InstanceNotFoundException: com.alibaba.druid:type=
  10. python 多线程处理图像,充分利用CPU