码迷,mamicode.com
首页 > 编程语言 > 详细

C之数组(二十五)

时间:2018-04-18 22:30:43      阅读:185      评论:0      收藏:0      [点我收藏+]

标签: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之数组(二十五)

标签:C语言   数组   

原文地址:http://blog.51cto.com/12810168/2105119

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!