您的位置:首页 > 编程语言 > C语言/C++

C语言快速入门之数组详解

2018-02-27 15:31 381 查看

数组

理解数组的概念和掌握数组的灵活使用,对我们学好接下来的指针有很大的关系,首先我们先看一维数组。
一维数组
char array[2];    这是一个char类型的一维数组,在内存中占有两个地址连续的存储空间,它所存储的元素都是相同类型的。注意:数组的下标是从0开始。即array[0],array[1]。
现在我们给array赋值。char array[2]="ok",printf("array is =%s\n",array);    发现确实打印了ok,但是ok后面是乱码的,为什么会这样呢。因为"ok"这个字符串最后面还有"/0",所以这里是3个字节。但是数组array我们只分配了2个字节的存储空间,内存不够导致数组越界。所以只需要把array[2]改成array[3]就可以正常打印了。所以一定要记住,当打印字符串的时候,字符串的后面还有结束符"\0",在给数组分配存储空间的时候,要多分配一个字节,用于存放"\0"。
再来看char array[2]={1,2};    我们在这里,把1存放在array[0]中,把2存放在array[1]中,表面上是这样理解的,但是我们需要理解计算机存储的原理,首先我们对计算机的操作实际上都是对地址的操作,C语言是面向过程的语言,我们需要了解到计算机的内部是如何工作的,才能更加深刻的掌握C语言。
在这里数组array的地址其实就是array[0]的地址,因为数组名的地址就是数组首元素的地址,而数组是地址连续的存储空间,所以我们知道数组首元素的地址,就可以遍历得到后面所有数组元素的地址。所以我们发现,1其实是放在array[0]指向的地址上,因为数组即指针,指针就是指向地址的变量,就可以通过指针变量来找到它指向的地址,然后得到地址上存放的数值。所以上面的理解可以改为,1存放在array[0]指向的地址中,2存放在array[1]指向的地址中。清楚了这个概念,在后面,我们就可以很快的掌握一级指针的概念了。我们用一段代码来说明一下。
示例代码
#include<stdio.h>
int main()
{
char buf[2]="hi";
printf("buf is %s\n",buf);//打印hi,但是会出现乱码,数组越界

char array[3]="ok";
printf("array is %s\n",array+1);//打印k

char *p=array;
printf("p is %s\n",p);//打印ok
printf("p+1 is %s\n",p+1);//打印k,发现k+1和array+1打印的结果一样

return 0;

}
这里提前说明一下指针的概念,在上面的代码,我们定义了一个指向char类型的指针变量p,记住,是指向char类型,而不是说指针p的类型是char,我们用这个指针p指向了数组array(即首元素array[0]的地址)。所以我们打印p,就是打印array的所有元素。至于打印p+1为什么输出k,就是上面说到的地址的概念了,首先p+1是一个指针操作,指针p指向了array[0]的地址,而数组的元素的地址是连续的,所以p+1,就是array[0]的地址+1,array[0]+1的地址就是array[1]的地址,而array[1]存放的元素是k。所以p+1打印k。注意:* 表示p是一个指针变量。
对于一维数组,还有以下几个概念
char a[]={1,2,3,4};    如果我们在花括号中给定了数组各个元素的值,就不需要在[ ]中写上4,因为系统知道,我们分配了4个元素,所以1,2,3,4会依次存放在数组中。如果写成char a[];是错误的,因为计算机不知道我们要给这个数组分配多大的内存空间。
数组还可以这样写,char a[3]={1,2};    在这里,我们只给数组a赋值了1和2,但是地址是3个,经过打印我们发现,编译器会默认把a[2]的值打印0。很多概念当我们不清楚的时候,写一段代码检验一下,就可以知道事情的真相了。程序员很适合这句话,实践是检验真理的唯一标准。   
----------------------------------------------分割线------------------------------------------------------------------
二维数组
二维数组是特殊的一维数组。对于二维数组,我们举例说明。
char a[2][3]={1,2,3,4,5,6};    在这里,我们定义了一个数组名为a的二维数组,平面化的理解就是,这是一个2行3列的数组   

123
456
a[0][0]=1    a[0][1]=2    a[0][2]=3
a[1][0]=4    a[1][1]=5    a[1][2]=3
平面化的概念便于我们观察二维数组各个元素的值。但是,在计算机中,任何数值都是存放在内存中的,2行3列的平面概念不利于我们加深对内存的理解。如果我们把数组比喻成各种各样的房子,是不是就有立体感了,就能更好的理解计算机内部的存储原理了。我们先抛砖引玉一下,对于一维数组char a[3]={1,2,3};    我们可以把它看做是3个连续的房子A,B,C(a[0],a[1],a[2]),房子里面分别存放了 1,2,3这三个货物,因为房子是连续的,所以我们通过房子A,就可以找到房子B,然后找到房子C。当然如果我们知道C的地址,也可以通过C来找到A和B的地址。无论有多少房子,只要我们找到了第一个,或者其中一个,可以知道其他房子的位置(即地址)。
二维数组也是一样,它是特殊的一维数组,char a[2][3]={1,2,3,4,5,6}    其实是a这个房子,存放了两个箱子(a[0],a[1]),而这两个箱子里面呢,又分别存放了3个小箱子(a[0][0],a[0][1],a[0][2] 与 a[1][0],a[1][1],a[1][2]),这就是二维数组。我们发现它们其实都是一维数组组成的,所以称之为特殊的一维数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: