概述
一.为什么需要数组
1.解决大量同类型数据的存储/命名/使用问题
2.模拟现实世界:如1维数组可以模拟1条直线,2维数组可以模拟1个平面
二.1维数组
1.如何定义1个1维数组:
< avar>和&< avar>的区别参见:https://blog.csdn.net/zj490044512/article/details/86353764
<type> <avar>[<n>]={<a1>...<an>};
//会为这n个变量分配连续的(虚拟)内存空间,但分配的物理内存中不一定连续
//C语言中数组的本质是1个常指针(不能修改数组指向的地址)
//也可以使用const关键字将数组定义为常变量(这样就不能修改数组指向的地址处的数据)
//等号右边的列表称为"初始化列表"
//参数说明:
type:数组中元素的数据类型
//可为普通变量使用的任何类型,如int/int*
avar:数组的名字
//该参数的值是avar[0](即a1)的内存地址
//avar的数据类型是<type>*
n:数组中元素的个数
a:数组中的各个元素
//数组中所有元素的数据类型和占用的字节数都必须相等
//实例:
int a[5]={1,2,3,4,5};
float b[3]={1.1,2.2,3.3};
char c[4]={'a','s','A','3'};//注意:字符数组中元素必须为char,即必须被'...'包裹
printf("%d",sizeof(c));//结果:4
//为数组中的元素分配的内存空间是连续的:
int a[5]={1,2,3,4,5};
printf("%d,%d,%d,%d,%dn",&a[0],&a[1],&a[2],&a[3],&a[4]);
//结果:6487536,6487540,6487544,6487548,6487552
//用于识别数组元素的数字称为下标(Subscript)/索引(Indice)/偏移量(Offset),即第2条语句中的0/1等
2.数组的初始化:
//完全初始化:
int a[5]={1,2,3,4,5};
//不完全初始化:未被赋值的元素的值默认为0或空格
int b[5]={1,2,3};
printf("%dn",b[4]);//结果:0
char c[5]={'a','b'};
printf("%cn",c[5]);//结果: (有1个空格)
//未初始化:所有元素的值都是垃圾值或空格
int d[3];
printf("%dn",d[2]);//结果:31
char e[3];
printf("%cn",e[2]);//结果: (有1个空格)
//清零:所有元素都被赋值为0
int f[3]={0};
printf("%dn",f[1]);//结果:0
- 几种错误写法:
//只有定义数组时才能给整体赋值:
//只有在定义数组时[...]中的值才代表元素个数,其他时候都表示索引
int a[5];
a[5]={1,2,3,4,5};//错误
int b[3]={1,2,3};
b[3]={3,2,1};//错误
int c[2]={0,1};
c={1,2};//错误
//不能给不在范围内的元素赋值:
int d[3]={1,2,3};
d[10]=100;//错误
//把1个数组复制1份:
int e[5]={1,2,3,4,5};
int f[5];
f=e;//错误,[Error] assignment to expression with array type
//因为数组的变量名代表的是其中第1个元素的内存地址
for (int i=0;i<5;++i) {
f[i]=e[i];//正确
}
3.其他操作:
//排序:以冒泡排序为例
#include <stdio.h>
void sort(int* avar,int len) {
int i,j;
for (i=0;i<len-1;++i) {
for (j=0;j<len-i-1;++j) {
if (avar[j]>avar[j+1]) {
int t=avar[j];
avar[j]=avar[j+1];
avar[j+1]=t;
}
}
}
}
int main(void) {
int a[6]={10,2,8,-8,11,0};
sort(a,6);
int i;
for (i=0;i<6;++i) {
printf("%d ",a[i]);//结果:-8 0 2 8 10 11
}
printf("n");
}
//####################################################################################################################
//求最大/小值:以求最大值为例
#include <stdio.h>
int max(int* avar,int len) {
int i,m=avar[0];
for (i=1;i<len;++i) {
if (avar[i]<avar[i+1]) {
if (avar[i+1]>m) {
m=avar[i+1];
}
} else if (avar[i]>m) {
m=avar[i];
}
}
return m;
}
int main(void) {
int a[6]={-22,11,1,10,8,0};
int m=max(a,6);
printf("%dn",m);
}
//####################################################################################################################
//倒置:
int main(void) {
int a[7]={1,2,3,4,5,6,7};
int i=0,j=6,t;
while (i<j) {
t=a[i];
a[i]=a[j];
a[j]=t;
i++;
j--;
}
for (i=0;i<7;i++) {
printf("%d ",a[i]);//结果:7 6 5 4 3 2 1
}
return 0;
}
//####################################################################################################################
//查找:查找数组中为指定值的第1个元素
#include <stdio.h>
int find(int* avar,int len,int val) {
int index;
for (index=0;index<len;++index) {
if (avar[index]==val) {
return index;
}
}
return -1;
}
int main(void) {
int a[10]={1,4,3,2,11,-2,3,0,-9,8};
int index=find(a,10,3);
if (index==-1) {
printf("No such elementn");
} else {
printf("index=%d,value=%dn",index,a[index]);//结果:index=2,value=3
}
return 0;
}
//####################################################################################################################
//插入:
//####################################################################################################################
//删除:
4.通过输入赋值:
#include <stdio.h>
int main(void) {
char m[5];
scanf("%s",m);//输入:wwe
//m本身就是数组首元素的地址,故不应加&
printf("%sn",m);//结果:wwe
printf("%cn",m[0]);//结果:w
}
三.多维数组
1.如何定义1个多维数组:
<type> <avar>[<n1>][<n2>]...;
//为2维数组时,相当于1个矩阵,n1为行数,n2为列数
//注意:<type> <avar>[<n1>][<n2>]是1个包含n1个元素的数组,其中每个元素都是1个包含n2个元素的数组
//参数说明:
n1,n2...:沿各维度的元素数
//实例:
int a[2][3];
2.初始化:
//方法1
<type> <avar>[<n1>][<n2>]...={<a1>...<a(n1×n2×...)>};
//参数说明:
a1,a2...:所有元素(总共应为n1×n2×...个)
//实例:
int a[2][3]={1,2,3,4,5,6};
注意:如果初始化列表中的元素过少,会按a[1][1]...a[1][n],a[2][1]...的顺序初始化
直到初始化列表中的值用完,剩下的值设为0或空格
//
//方法2:
<type> <avar>[<n1>][<n2>]={
{<a11>,<a12>...<a1n2>},
{<a21>,<a22>...<a2n2>},
...
{<an11>,<an12>...<an1n2>}//最后1行没有逗号
};
//参数说明:
aij:指定位置处的元素
//实例:
char b[3][3]={
{'a','b','c'},
{'d','e','f'},
{'g','h','i'}
};
printf("%cn",b[1][2]);//结果:f
3.一些说明:
严格来说,不存在多维数组,因为内存是1维线性的
1个n维数组应被看做1个所有元素都是n-1维数组的1维数组
四.索引
1.通过索引取值:
<avar>[<x1>][<x2>]...
//参数说明:
avar:数组的名字
x:第x个元素(编号从0开始)
//实例:
int a[5]={1,2,3,4,5};
int x;
for (x=0;x<5;x++) {
printf("%dn",a[x]);//结果:1 2 3 4 5
}
printf("%dn",a[100]);//结果:0(未初始化)
char c[4]={'a','s','A','3'};
int y;
for (y=0;y<4;y++) {
printf("%cn",c[y]);//结果:a s A 3
}
printf("%dn",c[100]);//结果:0
int b[2][3]={1,2,3,4,5,6};
int i,j;
for (i=0;i<2;i++) {
for (j=0;j<3;j++) {
printf("%d ",b[i][j]);//结果:1 2 3 4 5 6
}
}
2.通过索引赋值:
<avar>[<x>]=<val>
//参数说明:其他参数同 四.1
val:指定元素的新值
int f[3]={1,2,3};
printf("%d,%dn",f[1],f[2]);//结果:2,3
f[2]=0;
printf("%d,%dn",f[1],f[2]);//结果:2,0
3.关于索引越界:
该问题参见:https://q.cnblogs.com/q/51671/
C语言不检查索引是否越界(不过有的编译器会发出警告),以提高运行速度
索引越界的问题在C标准中未被定义,结果取决于编译器
//索引即使越界,有时仍能得到正确结果:
int a[5]={1,2,3,4,5};
printf("%dn",a[5]);//结果:3
a[5]=10;
printf("%dn",a[5]);//结果:10
//这时,a其实是使用了没有分配给自己的内存
//但是,结果常常不可预测:
int b[5]={1,2,3,4,5,6};
printf("%d,%dn",b[2],b[5]);//结果:3,0
//同时有警告:[Warning] excess elements in array initializer
// [Warning] (near initialization for 'b')
五.动态数组
参见 动态内存分配 部分
六.字符串
C语言中没有可以直接存储多个字符的数据类型,需要通过字符数组来完成该功能:
char <str>[<n>][={'<char1>','<char2>'...}];
char <carray>[<n>][="<str>"];
//参数说明:
darray:指定数组名
n:指定数组长度
char:指定数组成员
str:指定该字符串为数组的内容
最后
以上就是搞怪往事为你收集整理的C语言基础 数组的全部内容,希望文章能够帮你解决C语言基础 数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复