我是靠谱客的博主 搞怪往事,最近开发中收集的这篇文章主要介绍C语言基础 数组,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一.为什么需要数组

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语言基础 数组所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部