C之数组(二十五)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C之数组(二十五)相关的知识,希望对你有一定的参考价值。
在 C 语言中,我们不可避免的要接触到数组。我们就来看看数组是什么玩意,其实数组就是相同类型的变量的有序集合。下面这张图更加形象的表示出数组的含义
数组在一片连续的内存空间中存储元素,数组元素的个数是可以显示或隐式指定的。比如: int a[5] = {1, 2}; int b[] = {1, 2};那么问题来了,数组 a 中其余没指定的三个数是多少呢?数组 b 到底包含了多少个元素呢?我们下来做个实验看看是怎样的,代码如下
#include <stdio.h> int main() { int a[5] = {1, 2}; int b[] = {1, 2}; printf("a[2] = %d\n", a[2]); printf("a[3] = %d\n", a[3]); printf("a[4] = %d\n", a[4]); printf("sizeof(a) = %d\n", sizeof(a)); printf("sizeof(b) = %d\n", sizeof(b)); printf("count for a: %d\n", sizeof(a)/sizeof(int)); printf("count for b: %d\n", sizeof(b)/sizeof(int)); return 0; }
编译后结果如下
那么我们看到编译器默认指定数组后面没指明的元素全都为0,而隐式指定的数组的大小就是它们所包含的元素的个数。
那么接下来我们来看看数组地址与数组名的关系。数组名代表数组首元素的地址,数组的地址需要用取地址符 & 才能得到;数组首元素的地址与数组的地址值相同,但是数组首元素的地址与数组的地址是两个不同的概念。我们来做个实验,可以更加清晰的理解这段所说的概念,代码如下
#include <stdio.h> int main() { int a[5] = { 0 }; printf("a = %p\n", a); printf("&a = %p\n", &a); printf("&a[0] = %p\n", &a[0]); return 0; }
编译结果如下
我们看到三个地址相同。数组名代表首元素的首地址,在这块,第一个和第三个就是相同的意义。但是第二个和他们所代表的意义不相同。举个例子来说,举行人大时,每个人代表他们各自的省份,在这时他一个人就可以代表他们的省份的意见。但你能说他和他的省份是一个概念嘛,显然是不一样的,只是在特定环境下仅仅相同罢了。
接下来我们介绍个有趣的,数组名其实可以看做一个常量指针。数组名“指向”的是内存中数组首元素的起始位置,但数组名不包含数组的长度信息;在表达式中数组名只能作为右值使用,只有在以下两种场合中数组名不能看做是常量指针:a> 数组名作为 sizeof 操作符的参数;b> 数组名作为 & 运算符的参数。下来我们再做个示例代码分析下,代码如下
#include <stdio.h> int main() { int a[5] = {0}; int b[2]; int* p = NULL; p = a; printf("a = %p\n", a); printf("p = %p\n", p); printf("&p = %p\n", &p); printf("sizeof(a) = %d\n", sizeof(a)); printf("sizeof(p) = %d\n", sizeof(p)); printf("\n"); p = b; printf("b = %p\n", b); printf("p = %p\n", p); printf("&p = %p\n", &p); printf("sizeof(b) = %d\n", sizeof(b)); printf("sizeof(p) = %d\n", sizeof(p)); b = a; return 0; }
我们在第9行将数组名 a 赋值给指针 p,这是没错的,因为数组名可以看做是数组首元素的首地址。我们接着通过打印 a 和 p 的地址应该是相同的,但是指针也是变量,它自身也有地址,所以第13行打印出来的应该和前两个地址不相同。接下来打印数组 a 的大小应该是20,指针 p 的大小应该是 4。显示指定的数组 a 和 隐式指定的数组 b 的情况应该是相同的。但第27行是两个数组名进行赋值操作,这肯定会出错。从另一个角度看,我们前面说了数组名可以看做是一个常量指针,那么我们将常量指针赋值给另一个常量指针肯定会出错啊。接下来我们看看编译结果
编译报错,我们注释掉第27行,再次编译
我们看到结果和我们分析的是一致的。通过对数组的学习,总结如下:1、数组是一片连续的内存空间;2、数组的地址和数组首元素的地址意义不同;3、数组名在大多数情况下被当成常量指针处理,单数数组名并不是指针,不能将其等同于指针。
欢迎大家一起来学习 C 语言,可以加我QQ:243343083。
以上是关于C之数组(二十五)的主要内容,如果未能解决你的问题,请参考以下文章
BetaFlight模块设计之二十五:dispatch任务分析
Hadoop MapReduce编程 API入门系列之join(二十五)(未完)