sizeof并不是函数,是C语言中的关键字,使用sizeof可以得到变量的类型所占的空间大小。
1、对数组使用sizeof

 int a[5] = { 1,2,3,4,5 };printf("sizeof a = %d\n", sizeof(a));
 sizeof a = 20

sizeof数组名,返回数组所占大小。

 printf("sizeof a[0] = %d\n", sizeof(a[0]));

sizeof数组元素,返回数组元素所占大小,sizeof(a[0]) = 4。

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

sizeof数组首地址,则返回的是指针大小,在64位平台下,返回值为8。
想要返回数组中单个元素所占空间大小,则应sizeof(数据类型)。sizeof(数组名)返回整个数组所占空间大小,sizeof(数组类型)返回数组中单个元素所占大小,那么sizeof(数组名)/sizeof(数组类型)则返回数组中元素个数。

 printf("sizeof elements = %d\n", sizeof(a)/sizeof(int));

2、数组和指针的区别
前面sizeof(a[0]) = 4,那么sizeof(&a[0]) 的值为多少呢

 printf("sizeof &a[0] = %d\n", sizeof(&a[0]));

返回值也为8。这里&a[0]和&a 到底有什么区别呢? a[0]是一个元素, a 是整个数组,虽然&a[0]和&a的值一样,但其意义不一样。前者是数组首元素的首地址,而后者是数组的首地址。
a 作为右值时其意义与&a[0]是一样,代表的是数组首元素的首地址,而不是数组的首地址。
a 不能作为左值,编译器会认为数组名作为左值代表的意思是 a 的首元素的首地址,但是这个地址开始的一块内存是一个总体,我们只能访问数组的某个元素而无法把数组当一个总体进行访问。所以我们可以把 a[i]当左值,而无法把 a当左值。

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

(&a + 1)是什么含义呢,&a 是数组a 的首地址,该地址的值加上 1也就是加上sizeof(a) 的值,即 &a + 5*sizeof(int),显然当前指针已经越过了数组的界限。所以上面的输出中,(a + 1)是a[1]的值,而**(ptr - 1)不是a[1]的值,是a[5]的值。这个例子的输出是2,5*
现在更改上面的指针赋值方式:

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

a是数组元素的首地址,也就是a[0]的地址,那么(a+1)是下一个数组元素的地址,也就是a[1]的地址。这个例子的输出是2,1

sizeof的使用(指针和数组地址的区别)相关推荐

  1. char *a 和char a[] 的区别(指针和数组的区别)

    2019独角兽企业重金招聘Python工程师标准>>> 在C/C++中,指针和数组在很多地方可以互换使用,这使得我们产生一种错觉,感觉数组和指针两者是完全等价的,事实上数组和指针是有 ...

  2. C++学习笔记----3.2 C++引用在本质上是什么,它和指针到底有什么区别

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有 ...

  3. c++值传递,指针传递,引用传递以及指针与引用的区别

    值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...

  4. 24.指针和引用的区别

    在面试时经常会被问到 指针和引用的区别,虽然问题很简单但还是总结一下! 指针和引用的区别其实有太多了,主要的区别大概是这样子: 1)指针声明的时候可以不被初始化(有可能成为野指针),但是引用必须要进行 ...

  5. C/C++ 中指针和引用的区别

    C/C++ 中指针和引用的区别 1.指针有自己的一块空间,而引用只是一个别名: 2.使用 sizeof 看一个指针的大小是 4,而引用则是被引用对象的大小: 3.指针可以被初始化为 NULL,而引用必 ...

  6. C++指针和数组的区别(不能混用的情况)

    通常情况下,C++中指针和数组是可以混用的,但是,在编写字符数组的全排列的时候,混用却出了问题,因此,今天特地mark一下,以备日后查找 这里整理的,不包括用new开辟的动态数组 1.数组一旦声明,我 ...

  7. 【转】指针和引用的区别

    c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使 ...

  8. C++中指针与引用的区别

    指针的本质 指针p也是对象,只不过p存储的数据类型是它所指的对象的地址.可以通过解引用操作符""来访问对象的值,即p. 对象有常量(const)和非常量之分,如果指针本身是常量,即 ...

  9. C++指针和引用的区别

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有 ...

最新文章

  1. 1、CSS 框模型概述(盒模型)
  2. 中文手机评论情感分类系列(一)
  3. 深入了解crc32算法
  4. Vue.js组件的重要选项
  5. 第 16 章 垃圾回收相关概念
  6. 蓝桥杯 ALGO-150 算法训练 6-1 递归求二项式系数值
  7. 基于RV1126平台imx291分析 --- 回顾之前的注册
  8. 浅析麒麟信安云几大优势之“安全性”篇
  9. Valgrind User Manual
  10. 无U盘的Ubuntu双系统安装方法
  11. 惠普传真服务器位置,惠普传真机的使用方法
  12. 参考文献标准格式总结
  13. 深入理解:面向服务与微服务架构
  14. 闲赋在家的猿们、接下来怎么走?
  15. man手册,安装中文手册
  16. ubuntu php mysql 乱码,ubuntu 服务器字符乱码问题
  17. Y470N 显卡超频了GT550m 完美2.10 bios
  18. 顺丰理赔要讲究方法,注意这几个方面能获得满意结果
  19. JVM内存模型、相关参数设置与命令查看
  20. Google开源C++模板库ctemplate完整使用示例

热门文章

  1. 浅析oracle常见等待事件之 db file scattered read
  2. Vmware 12 和CentOS 7 镜像下载
  3. CF708A Letters Cyclic Shift 题解
  4. LeetCode 708. 循环有序列表的插入*
  5. 常量和变量,整型变量
  6. 携职教育:【财务人必备】15个生产数据分析表(带释义和公式)
  7. 情和色 男人最爱的是哪个?
  8. mate30计算机没有记忆功能吗,EMUI 10这个功能,让Mate30和Matebook在一起了
  9. 304,301,302状态码的分析
  10. linux hdparm 测试磁盘io,Linux hdparm命令