19-C语言中的数组知识汇总

人工智能

629人已加入

描述

一、数组1.数组基础

数组是相同类型数据的集合,它们都拥有同一个名称。在大数量处理和字符串操作时,广泛使用数组。数组对C语言来说起着相当至关重要的作用。
定义一个数组,10个元素为int类型的数组
类型名(int[10]) + 变量名(arr)

2.数组完全初始化#includeint main(void) { int arr[5] = {1,2,3,4,5,}; printf("arr[2] = %d\n", arr[2]); } root@ubuntu:/mnt/hgfs/SHARE/2# ./a.outarr[2] =33.数组遍历

数组下标越界,编译器不检查,提高效率

#includeint main (void) { int arr[5]={1,2,3,4,5}; int i =0;for(i; i<5; i++) { printf("arr[%d]= %d\n", i, arr[i]); } } root@ubuntu:/mnt/hgfs/SHARE/2# ./a.outarr[0]=1arr[1]=2arr[2]=3arr[3]=4arr[4]=54.数组部分初始化intarr[5];intarr_[5] = {1};intarr_3[5] = {};intarr_4[5] = {[2]=100};5.数组格式intnum =0;scanf("%d",&num);intarr[num]={};//error: variable-sized object may not be initialized不能初始化可变化大小的对象。//数组格式是常量,此时是变量6.左值和右值

左值代表的是内存空间,右值代表的是值(内存空间内容)
数组名作为右值,打印的是地址,数字首元素首地址

*i = arr+1 指向数组第二个元素
*i = &arr+1 指向整个数组之后的第一个元素

7.传值调用

函数调用只是传进去实参的变量名字
数组名作为参数时,丢失了数组本身的大小,退化成了一个指针
数组名作为参数,要加上自己的大小(个数)

二、数组的应用1.冒泡排序#includeintmain(void) {intarr[10];inti =0, j =0, temp =0;printf("请输入10个数:\n");for(i; i<10; i++) scanf("%d",arr+i);for(i=0; i<10; i++)printf("%2d",arr[i]);printf("\n排序后\n");for(i=0; i<9; i++) {for(j=0; j<9-i; j++) {if(arr[j] > arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } }for(i=0; i<10; i++) {printf("%2d",arr[i]); }printf("\n"); } root@ubuntu:/mnt/hgfs/SHARE/1# ./a.out请输入10个数:13582467031358246703排序后01233456782.选择排序#includeintmain(void) {intarr[10];inti =0, j =0, temp;printf("请输入5个数:\n");for(i=0; i<5; i++) scanf("%d",&arr[i]);for(i=0; i<5; i++)printf("%2d",arr[i]);printf("\n排序后\n");for(i=0; i<5; i++) {for(j=i+1; j<5; j++) {if(arr[i] for(i=0; i<5; i++) {printf("%2d",arr[i]); }printf("\n"); } root@ubuntu:/mnt/hgfs/SHARE/1# ./a.out请输入5个数:5824658246排序后865423.进制转换#includeintfun(void) {chararr[100]={0}, i =0;inta =0, b =0;printf("请输入一个数:");scanf("%d",&a);printf("请输入转换的进制数:");scanf("%d",&b);do{ arr[i] = a % b; a = a / b; i++; }while(a >0);for(i=i-1; i>=0;i--) {if(arr[i] <10) {printf("%d",arr[i]); }else{printf("%c",arr[i]-10+'A'); } } }intmain(void) { fun(); } root@ubuntu:/mnt/hgfs/SHARE/1# ./a.out请输入一个数:666请输入转换的进制数:1629A

注:error:Segmentation fault(core dumped)
指针的问题,这个字符串放在了代码段,是只读(常量区);

4.求数组最大值及其下标#includeintfind_max_data(intarr[],intlenth,int*p) {inti =0, max =0;for(i; iif(arr[i] > max) { max = arr[i]; }*p= i; }returnmax; }intmain(void) {intarr[5] = {1,2,7,9,3};intmax =0;intindex=0; max = find_max_data(arr,5,&index);printf("下标为%d的值%d最大\n",index,max); } root@ubuntu:/mnt/hgfs/SHARE/1# ./a.out下标为4的值9最大5.二分法递归查找有序数列#includeintsearch(intarr[],intleft,intright,intdata) {intmid = (left + right)/2;if(data == arr[mid]) {printf("找到数组下标%d的数据%d\n", mid, data);return; }if(left > right) {printf("找不到数据%d\n",data);return; }if(data > arr[mid]) { search(arr, mid+1, right, data); }if(data < arr[mid]) { search(arr, left, mid-1, data); } }intsearch_arr_element(intarr[],intleft,intright,intdata) {intmid =0;while(left <= right) //13568{ mid = (left + right)/2;if(data > arr[mid]) { left = mid +1; }elseif(data < arr[mid]) { right = mid -1; }else{returnmid; } }return-1; }intmain(void) {intmid;intdata;intarr[5]={1,3,5,7,9};printf("请输入要寻找的数:"); scanf("%d",&data); search(arr,0,4,data); } root@ubuntu:/mnt/hgfs/SHARE/1# ./a.out请输入要寻找的数:5找到数组下标2的数据56.循环右移#include#includevoidfunc(charbuf[],intsteps) {inti =0, lenth =0, temp =0, j =0; lenth =strlen(buf);for(j=0; j1];for(i=lenth-1;i>0;i--) { buf[i] = buf[i-1]; } buf[0] = temp; } }intmain(void) {charbuf[] ="123456789";intsteps =0;printf("请输入需要移位的位数:");scanf("%d",&steps);printf("buf = [%s]\n",buf); func(buf, steps);printf("buf = [%s]\n",buf); } root@ubuntu:/mnt/hgfs/SHARE/1# ./a.out请输入需要移位的位数:5buf = [123456789] buf = [567891234]三、二维数组

二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称变方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。

<定义>

例如:
float a[3][4],b[5][10];
定义a为3*4(3行4列)的数组,b为5*10(5行10列)的数组。
注意,不能写成float a[3,4],b[5,10];

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分