数组
当我们要保存数量比较大的数据时如果就之前所学习的内容需要非常多的变量,使用起来异常麻烦比如要输入一个字符串"hello world"
就首先需要知道字符串的长度然后再定义相同长度的变量然后再逐个输入非常麻烦!
那么怎么办呢,这里就引入了一个特殊的类型数组
。
数组就是一组名字相同,类型相同但是带有不同下标的变量。
数组可以有多个维度,分为一维数组和多维数组
上面只是一个例子,代表着立体的多维数组的样式。
一维数组的定义
当数组的下标只有一个的时候就是一维数组,相当于只有一行。所有的数据都在一行上面。
定义方式
类型说明符 数组名[常量表达式] type array_name[n]
举例:
int a[10]; //整型长度为10的数组 float b[8]; //浮点型长度为8的数组 char c[15]; //字符型长度为15的数组 char *p[]; //字符型的一维数组指针
其中编号是从0开始的直到n-1结束。共计n个
举例:
int a[10]; 里面的值为 a[0] a[1] a[2]… a[9]
要读取数组中的某一个值我们可以直接使用下标进行读取。
如第5个值就可以直接使用a[4]对数据进行读取。
如果读取第10个值就使用a[9]
但是如果使用a[10]不会进行报错但是数据会出现问题(后面会进行试验,这个需要在特殊时期进行设计使用)
一维数组初始化
- 方法一:
type array_name[]={value}
这种办法无需定义数组的长度,可以直接进行赋值,赋值的长度就是最后数组的实际长度。
举例:
int a[]={0,1,2,3,4,5,6,7,8,9};
#include<stdio.h> main(){ int a[]={0,1,2,3,4,5,6,7,8,9}; printf("%d",sizeof(a)/sizeof(a[0])); }
说明:
sizeof用于计算占用空间的大小,先使用sizeof计算整个a的大小然后除以一个值占用的大小就是a的长度。
a_length=sizeof(a)/size(a[n])除以任何一个值都一样
a_length=sizeof(a)/size(int) 除以数据类型的大小也一样
- 方法二:
type array_name[n]={value}
这种办法先定义了数组的长度,然后再进行实例化,可以全部实例化也可以部分实例化
举例:
int a[10]={0,1,2,3,4,5,6,7,8,9}; int b[10]={1,2};
a的长度是10,值是0,1,2,3,4,5,6,7,8,9;
b的长度是10,值是1,2,0,0,0,0,0,0,0,0;
#include<stdio.h> main(){ int a[10]={0,1,2,3,4,5,6,7,8,9}; // 定义a int b[10]={1,2}; // 定义b int a_length=sizeof(a)/sizeof(a[0]); // 计算a的长度 int b_length=sizeof(b)/sizeof(b[0]); // 计算b的长度 int i=0,j=0; printf("a的值:\n"); for(i;i<a_length;i++){ // 循环得到a的值 printf("%d ",a[i]); } printf("\nb的值:\n"); for(j;j<b_length;j++){ // 循环得到b的值 printf("%d ",b[j]); } }
- 特殊情况
char
格式的数组,就不一样
他可以是直接使用字符串进行实例化。
char c[]="hello world"; char d[]={'h','e','l','l','o',' ','w','o','r','l','d'};
#include<stdio.h> main(){ char c[]="hello world"; char d[]={'h','e','l','l','o',' ','w','o','r','l','d'}; printf("%s\n",c); printf("%s\n",d); }
说明:虽然结果都是hello world
但是c和d数组的长度是不一样的。
之前字符串哪里说过字符串最后一位是’\0’所以c应该比d多一位。
证明:
#include<stdio.h> main(){ char c[]="hello world"; char d[]={'h','e','l','l','o',' ','w','o','r','l','d'}; printf("%s\n",c); printf("c的长度:%d\n",sizeof(c)/sizeof(c[0])); printf("最后一位的值为:%s\n",c[11]); printf("%s\n",d); printf("d的长度:%d\n",sizeof(d)/sizeof(d[0])); }
说明:如果没有实例化的数据默认为0
.
输出的下标及引用
之前定义的数组c对应的小标值
让我们查看一下第7个值吧
#include<stdio.h> main(){ char c[]="hello world"; char d[]={'h','e','l','l','o',' ','w','o','r','l','d'}; printf("%c ",c[6]); }
在对数组引用时也可以使用整数表达式。
例如:
a[1+4]; b[i+2j]; // i,j均为整数。
示例:
把一个数组正序输出和倒叙输出。
思路:
先实例化一个数组并定义
循环输出(通过循环方式不同修改下标)
#include<stdio.h> main(){ char c[]="hello world"; int i,j; for(i=0;i<12;i++){ printf("%c ",c[i]); } printf("\n"); for(j=11;j>=0;j--){ printf("%c ",c[j]); } }
实践:斐波那契数列完成法:
斐波那契是编程届出名的小白题目
我们这里以20为长度进行举例:
#include<stdio.h> main(){ int fibonacci[20],i,j; fibonacci[0]=0; // 实例化0 fibonacci[1]=1; // 实例化1 for(i=2;i<20;i++){ fibonacci[i]=fibonacci[i-2]+fibonacci[i-1]; // 循环计算 } for(j=0;j<20;j++){ printf("%-6d ",fibonacci[j]); // 循环输出 if((j+1)%5==0){ printf("\n"); } } }
思路解析:
首先定义一个20长度的数组
对下标为0,1的进行实例化(初始化)
再通过公式对后面的进行计算
接着for循环输出即可。
二维数组
二维数组和一维数组差不多就是多了一个维度,但是维度这种东西很抽象不好 理解,在这里尽量给大家细化。
先看例子把:
#include<stdio.h> main(){ int a[2][4]={{1,2,3,4},{5,6,7,8}}; // 定义一个二维数组 printf("%d\n",a[0][1]); // 输出下标是0,1的数据 printf("%d\n",a[1][1]); // 输出下标是1,1的数据 }
解析:
首先呢看一下两个维度怎么看。
上面二维的数据,怎么看两个[ ][ ]里面写上面呢?
怎么样看一组数据是几维呢?
[ ] [ ]这个要看{}里面的数据先看最里面那个{ }
例:{{1,2,3,4},{5,6,7,8}}
一共有两层嵌套就是二维数据
然后最里面一层的长度最大是4那么最后面的括号就是4
外层大括号里面有2个大括号那么第2层的内容就是2
举例
{{1,2},{3,4,5},{6,7,8,9},{},{}}
这个数据要怎么样定义?
实例化结果是多少?
首先看最里面一层的长度
2,3,4,0,0最长的是4那么第二个中括号就是4
再看外层嵌套了多少个花括号
一共是5个那么第一个中括号里面就是5
int a[5][4]
这个是标准的定义,两个值可以大于5,4这个数据,如果小于会出现警告:[Warning] excess elements in array initializer
那么最后我们得到的结果是什么呢?
#include<stdio.h> main(){ int a[5][4]={{1,2},{3,4,5},{6,7,8,9},{},{}},i,j; for(i=0;i<5;i++){ for(j=0;j<4;j++){ printf("%-3d",a[i][j]); } printf("\n"); } }
就是我们定义了的地方完成了局部实例化,其他地方使用0进行了补齐。
多维数组
多维数组与上方的方式差不多,就是嵌套了多层的大括号,这个就需要自己去理解了。
举例:
#include<stdio.h> main(){ int a[5][4][2]={{{1,2},{11,12},{}},{3,4,5},{6,7,8,9},{},{}},i,j,k; for(i=0;i<5;i++){ for(j=0;j<4;j++){ for(k=0;k<2;k++){ printf("%-3d",a[i][j][j]); } printf("\n"); } printf("\n"); } }