7、C语言:数组

数组的概念

数组是一组有序的类型相同的数据的集合,这些数据称为数组的元素

一维数组

  • 定义
    语法格式:类型说明符 数组名[正整型常量表达式]
    类型说明符指定数组的类型,数组名和变量名命名规则相同
    方括号内是数组的长度,下标或方括号的个数称为数组的维度
    数组元素的类型称为数组的基类型
    不允许使用变量对数组大小进行定义,数组的说明语句必须在可执行语句之前
  • 初始化
    1)对全部元素初始化:int a[5]={1,2,3,4,5};int a[] ={1,2,3,4,5};,即对全部元素赋值可以不指定长度
    2)对部分元素赋值,其他按0处理:int a[9] = {1,2};,这样a[0]=1,a[1]=2,其他元素为0
    3)一维数组赋值的个数不能超过数组长度
  • 一维数组的引用
    1)一次只能引用单个数组元素,不能一次引用整个数组
    2)数组名是数组的首地址,即a[0]的地址,是一个地址常量
    3)数组元素是一个数值,引用数组元素时,根据首地址和下标自动计算元素的实际地址
    4)不能直接数组a = 数组b的方式赋值,因为数组b只是一个地址,并不是实际的值
    5)要让一个数组赋值给另一个数组要逐个元素赋值或使用循环赋值
  • 程序实例
    1)利用数组计算斐波那契数列的前20个数,并以每行5个输出
    #include<stdio.h>
    int main(){
    	int F[20],i;
    	F[0] = F[1] = 1;
    	for (i=2;i<20;i++){
    		F[i] = F[i-1]+F[i-2];
    	}
    	for (i=0;i<20;i++){
    		if(i%5==0){
    			printf("\n");
    		}
    		printf("%6d",F[i]);
    	}
    	return 0;
    }
    
    2)随机输入6个整型数字,利用冒泡排序法排序
    #include<stdio.h>
    int main(){
    	int a[6],i,j,tmp,p;
    	for(i=0;i<6;i++){
    		scanf("%d",&a[i]);
    	}
    	printf("\n");
    	for(i=0;i<6-1;i++){
    		for(j=1;j<6-i;j++){
    			if(a[j-1]>a[j]){
    				tmp = a[j];
    				a[j] = a[j-1];
    				a[j-1] = tmp;
    			}
    		}
    	for(p=0;p<6;p++){
    		printf("%d ",a[p]);
    	}
    	printf("\n");
    	}
    	return 0;
    }
    }
    

二维数组

  • 定义
    语法格式:类型说明符 数组名[正整型常量表达式][正整型常量表达式]
    二维数组在内存中按行的顺序存放
    其他定义条件与一维数组相同
  • 初始化
    1)分行给二维数组赋值:int a[2][3] = {{2,3,1}, {1,2,3}};
    2)全部元素按顺序赋值:int a[2][3] = {2,3,1,1,2,3};int a[ ][3] = {2,3,1,1,2,3};,即第一个下标可以省略
    3)对部分元素赋值:int a[2][3] = {{1},{0,1},{0,0,1}};int a[2][3] = {{1},{},{0,0,1}};int a[2][3] = {{5,6},{7,8}};int a[2][3] = {5,6,7,8};
  • 二维数组的引用
    1)数组名是数组的首地址,即a[0][0]的地址,是一个地址常量
    2)数组名是常量,不能对其赋值
  • 程序实例
    将一个矩阵a={{1,2,3},{4,5,6}}转置存到另一个矩阵b中
    #include<stdio.h>
    int main(){
    	int a[][3] = {{1,2,3},{4,5,6}};
    	int b[2][3],i,j;
    	for(i=0;i<2;i++){
    		for(j=0;j<3;j++){
    			b[j][i] = a[i][j];
    		}
    	}
    	for(i=0;i<3;i++){
    		for(j=0;j<2;j++){
    			printf("%d ",b[i][j]);
    		}
    		printf("\n");
    	}
    	return 0;
    }
    

字符数组与字符串

  • 定义
    C语言用字符数组存放字符串
    语法格式:char 数组名[正整型常量表达式]
    字符串实际占有存储单元的数量等于字符串长度+1,因为还要存一位结束符 \0
    在这里插入图片描述
  • 初始化
    1)用单个字符对字符数组初始化
    char ch[6] = {'C','H','I','N','A','\0'};
    初值个数少于数组长度时,系统会自动添加结束符
    初值个数(包括结束符)等于数组长度时,定义时可以省略长度
    初值个数超过数组长度时,会报错
    2)用字符串常量对字符数组初始化
    char ch[6] = "china";char ch[] = "china"
    长度为n的数组,只能存n-1个字符,剩下的一位要给结束符
    char d[12]="How are you";等价于char d[12] = {'H','o','w','' ','a','r','e',' ' ,'y','o','u','\0'};
    在循环结构中可以用结束符来控制循环

字符数组的输入和输出

  • puts输出字符串函数、使用printf和%s输出字符串
    puts函数输出后会自动换行,而printf不会
    #include<stdio.h>
    int main(){
    	char a[] = "book";
    	printf("%s",a);
    	puts(a);
    	return 0;}
    
  • gets输入字符串函数、使用scanf和%s输出字符串
    gets可以接收空格,scanf不能
    使用scanf时数组名前不用&号
    &号的含义是取地址,而数组名本身就有代表地址的意思
    #include<stdio.h>
    int main(){
    	char a[12];
    	gets(a);  //输入How are you
    	puts(a);  //输出How are you
    	scanf("%s",a); //输入How are you
    	puts(a);	   //输出How
    	return 0;}
    
    在这里插入图片描述
  • 字符串处理函数,需要<string.h>
    1)strcat(字符数组1, 字符数组2):连接两个字符串
    2)strcpy(字符数组1, 字符数组2):将2拷贝到1中,1的长度应大于2
    3)strlen(字符数组):返回数组的长度(不包括\0)
    4)strlwr(字符数组):将大写字符串变为小写字符串
    5)strmp(字符数组1, 字符数组2):字符串的比较
    1. 比较两个字符串第一个不同字符的ACSII码的大小
    2. 如果全部字符都相等,返回0
    3. 如果有不相等的,返回该位置字符的ACSII码之差
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章