关于c:C进阶27数组的本质分析

2次阅读

共计 1448 个字符,预计需要花费 4 分钟才能阅读完成。

Summary

1)数组是 雷同类型 变量 有序汇合 ,数组在一片 间断的内存空间 中存储元素。

2)数组名 a 代表数组 首元素的地址 ,a 同时也代表数组 这一段间断的内存

  • a 是数组首元素的地址,类型是 int**a就是首元素,sizeof(*a)能够取得数组首元素的内存大小;a 同时也代表这一段内存,sizeof(a)能够取得数组的内存大小;sizeof(a) / sizeof(*a) = 数组元素的个数

3)数组的地址 须要用取地址符 & 取到,&a

  • &a 是数组的地址,类型是 int(*)[n].

4)数组首元素的地址 值与 数组的地址 值雷同,然而意义不同 ;(比方现实生活中,小区的地址和我家的地址是雷同的,但并不能说小区就是我家的)咱们所说的地址通常蕴含 2 个概念: 起始地址 + 长度

  • 值上,a == &a[0] == &a;但 意义不同 ,体现在 指针运算 上,a + 1,会挪动 sizeof(*a)个字节,&a + 1,会挪动 sizeof(a)个字节

5)数组名能够 看做 一个 指针常量 (留神是看做, 数组名并不是指针 ),因为数组名指向的是首元素的起始地位,是 一个地址 ,并且 不能作为左值 ,同时数组名在很多时候能够像指针一样操作,比方 指针运算 等。

6)在下列场合中,数组名就不能看做指针常量(也证实了数组名并不是指针)

  • 数组名作为 sizeof 的参数,这时候取的是数组内存的大小。(a 就不是个指针了,如果看做指针,就永远取到的是 4 或 8 字节,而不是数组 a 的大小)
  • 数组作为 & 运算符的参数,此时取到的是数组 a 的地址,同首元素的值。

数组的实质剖析

1、数组的概念

数组是 雷同类型 变量 有序汇合 ,数组在一片 间断的内存空间 中存储元素。

数组元素的个数能够显示或隐式指定:

详见:【C 入门】7、C 语言中的数组
int a[5] = {1, 2};
int b[] = {1, 2};

问题:1. a[2], a[3], a[3]的值是多少?-- 0,如果后面的元素指定了值,后续未初始化的均为 0
2. b 蕴含了多少个元素?-- 2,编译器会隐式推断 b 有多少元素

2、数组名的盲点

2.1 数组名 a 代表数组 首元素的地址 ,a 同时也代表数组 这一段间断的内存

  • a 是数组首元素的地址,类型是 int*;*a就是首元素,sizeof(*a)能够取得数组首元素的内存大小;a 同时也代表这一段内存,sizeof(a)能够取得数组的内存大小;sizeof(a) / sizeof(*a) = 数组元素的个数

2.2 数组的地址 须要用取地址符 & 取到,&a

  • &a 是数组的地址,类型是 int(*)[n].

2.3 数组首元素的地址 值与 数组的地址 值雷同,然而意义不同 ;(比方现实生活中,小区的地址和我家的地址是雷同的,但并不能说小区就是我家的)咱们所说的地址通常蕴含 2 个概念: 起始地址 + 长度

  • 值上,a == &a[0] == &a;但 意义不同 ,体现在 指针运算 上,a + 1,会挪动 sizeof(*a)个字节,&a + 1,会挪动 sizeof(a)个字节

2.4 数组名能够 看做 一个 指针常量 (留神是看做, 数组名并不是指针 ),因为数组名指向的是首元素的起始地位,是 一个地址 ,并且 不能作为左值 ,同时数组名在很多时候能够像指针一样操作,比方 指针运算 等。

2.5 在下列场合中,数组名就不能看做指针常量(也证实了数组名并不是指针)

  • 数组名作为 sizeof 的参数,这时候取的是数组内存的大小。(a 就不是个指针了,如果看做指针,就永远取到的是 4 或 8 字节,而不是数组 a 的大小)
  • 数组作为 & 运算符的参数,此时取到的是数组 a 的地址,同首元素的值。

本文总结自“狄泰软件学院”唐佐林老师《C 语言进阶课程》。
如有错漏之处,恳请斧正。

正文完
 0