【内功篇】指针&数组&字符串(二)

来源:互联网 发布:java截取字符串的函数 编辑:程序博客网 时间:2024/06/07 06:32

这篇呢就来讲一讲数组,为啥上一篇指针还没讲完就开始讲数组啦,其实指针数组字符串这三个东西关系比较大,放在一起可能更能理解它们之间的关系。


数组:

数组这东西说难不难,说简单也不简单,我也不是要做个教程,就不细说了,我就说说我认为比较重要的地方。
我们定义一个数组int a[10];我们怎么解读它呢,先看int,表示该数组里存的都是int型的数据,再看[10],表示int型的数据存了10个,可以看出它在内存中占了40个字节的空间,然后给个名字a代表数组名。这个a呢是什么,暂时先不说。

我们先看看一组代码:

int a[10];printf("a     = %p\n",a);printf("&a    = %p\n",&a);printf("&a[0] = %p\n",&a[0]);

打印出来:
这里写图片描述
再看一组代码:

int a[10] = {1,2};printf("*a     = %d\n",*a);printf("*&a    = %d\n",*&a);printf("*&a[0] = %d\n",*&a[0]);

打印出来:
这里写图片描述

两段代码,两个结果,看出来点什么了么。简单来讲,a代表了整个数组,a[0]代表了数组的首元素。那位什么他们的地址是一样的呢?这就要从a的左值右值来说了,a做为右值和&a[0]一样,这时的a表示数组首元素的首地址,那a作为左值呢,a不能作为左值,左值就是“=”左面的值,意味着可以修改,但是数组只能通过数组内元素的修改而达到修改,我们不能访问整个数组,从而对整个数组进行修改。

那么&a呢,有些人认为a表示的是数组的首地址,其实&a才是,
看段代码:

int a[10];printf("a         = %p\n",a);printf("&a        = %p\n",&a);printf("&a[0]     = %p\n",&a[0]);printf("a + 1     = %p\n",a+1);printf("&a + 1    = %p\n",&a+1);printf("&a[0] + 1 = %p\n",&a[0]+1);

打印下结果:
这里写图片描述

从它们的偏移地址可以看出,a和&a[0]向右偏移一位是4个字节,正好是一个整型的大小,而&a向右偏移一位是40个字节,是一个数组的大小,从这可以看出&a代表数组的首地址了吧。

这篇就说到这啦。

未完待续………………

阅读全文
0 0
原创粉丝点击