本章概述思維導圖:
C語言數組
在C語言中,數組是一種固定大小的、相同類型元素的有序集合,通過索引(下標)訪問。
數組
數組:是一種容器,可以用來存儲同種數據類型的多個值;
數組特點:
1.連續的空間;
2.一旦定義了,長度不可變換;
代碼示例:
#include <stdio.h>
int main()
{int arr1[3];//定義了數組:arr1;用來存儲3個int類型的數據;char arr2[3];//定義了數組:arr2;用來存儲3個char類型的數據;float arr3[3];//定義了數組:arr3;用來存儲3個float類型的數據;return 0;
}
數組的初始化
數組的初始化:定義數組的時候,第一次給數組賦值;
數組初始化細節:
長度省略:數組值的個數就是數組的長度;
長度未省略:數組的個數<=長度;
代碼示例:
#include <stdio.h>
int main()
{//長度未省略:數組的個數<=長度int arr1[3]={1,22,333};//定義了數組:arr1;用來存儲int類型的數據;char arr2[3]={'i','j','k'};//定義了數組:arr2;用來存儲char類型的數據;float arr3[3]={1.25,6.68,0.888};//定義了數組:arr3;用來存儲float類型的數據;//長度省略:數據值的個數就是數組的長度int arr4[]={8,9,100};//定義了數組:arr4;用來存儲int類型的數據;char arr5[]={'a','b','c'};//定義了數組:arr5;用來存儲char類型的數據;float arr6[]={154.25,9.68,3.888};//定義了數組:arr6;用來存儲float類型的數據;return 0;
}
數組中元素的訪問--獲取和修改
索引:索引就是數組的一個編號,也叫做:角標、下標、編號;
特點:從0開始的,連續+1,不間斷;
數組的獲取:
數組的修改:
索引細節:
1. 索引的范圍:最小索引0;最大索引:數組長度-1;
2. 越界訪問:C語言不檢查數組邊界,越界訪問會導致未定義行為(如崩潰或數據損壞)
代碼示例:
#include <stdio.h>
int main()
{//數組的初始化int arr1[3]={1,22,333};//定義了數組:arr1;用來存儲3個int類型的數據;char arr2[3]={'i','j','k'};//定義了數組:arr2;用來存儲3個char類型的數據;float arr3[3]={1.25,6.68,0.888};//定義了數組:arr3;用來存儲3個float類型的數據;//數組元素的獲取和修改arr1[0]=4;//將數組arr1中第一個元素:1 修改為:4;arr2[1]='a';//將數組arr2中第二個元素:j 修改為:a;arr3[2]=3.1415;//將數組arr3中第三個元素:0.888 修改為:3.1415return 0;
}
數組遍歷
在C語言中,數組遍歷是指依次訪問數組中的每一個元素,通常使用循環結構(如?for
、while
)實現。
代碼示例:
#include <stdio.h>
int main()
{//數組的初始化int arr1[3]={1,22,333};//定義了數組:arr1;用來存儲3個int類型的數據;char arr2[3]={'i','j','k'};//定義了數組:arr2;用來存儲3個char類型的數據;float arr3[3]={1.25,6.68,0.88};//定義了數組:arr3;用來存儲3個float類型的數據;//遍歷數組arr1for(int i=0;i<3;i++)printf("arr1[%d]=%d\t",i,arr1[i]);putchar('\n');//遍歷數組arr2for(int i=0;i<3;i++)printf("arr2[%d]=%c\t",i,arr2[i]);putchar('\n');//遍歷數組arr1for(int i=0;i<3;i++)printf("arr1[%d]=%.2f\t",i,arr3[i]);putchar('\n');return 0;
}//代碼運行結果:
arr1[0]=1 arr1[1]=22 arr1[2]=333
arr2[0]=i arr2[1]=j arr2[2]=k
arr1[0]=1.25 arr1[1]=6.68 arr1[2]=0.88
內存和內存地址
內存和內存地址
內存:軟件程序在運行時,用來臨時存儲數據的,操作系統會把內存按照字節劃分為N多個小格子
內存地址:內存中每一個小格子的編號(一格小格子1字節(8位));
內存地址作用:快速的管理內存空間;
通常用十六進制表示
C語言中的內存地址:
示例:
int 類型--->4個字節? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 首地址-->找到第一個小格子;根據4個字節
char類型-->1個字節? ? ? ? ? ? ? ? ? ? ? ? ? ? ?首地址-->找到第一個小格子;根據1個字節
取地址占位符:%p;
代碼示例:
#include <stdio.h>
int main()
{ int num1=0;printf("num1的地址為:%p\n",&num1);int arr1[3]={1,22,333};printf("arr1的地址為:%p\n",arr1);return 0;
}//代碼運行結果:
num1的地址為:0x7ffeaba095d8
arr1的地址為:0x7ffeaba095dc
內存地址的規則:每個內存單元有唯一地址:無論是代碼、數據還是棧/堆空間,每個字節都有一個獨立的地址。
數組在內存中的深入刨析
數組名是首地址,索引在輸出數組的地址時不需要取地址符:&;
代碼示例:
#include <stdio.h>
int main()
{ int arr1[3]={1,22,333};printf("arr1的地址為:%p\n",arr1);return 0;
}//代碼運行結果:
arr1的地址為:0x7ffeaba095dc
數組的地址是連續的:數組元素的地址按類型大小連續排列;
數組名【索引】:地址偏移n個單位;
單位:根際數據類型相關;int4個字節、char1個字節……
代碼示例:
#include <stdio.h>
int main()
{int arr1[3]={1,22,333};printf("arr1[0]:%p\tarr1[1]:%p\tarr1[2]:%p\t\n",&arr1[0],&arr1[1],&arr1[2]);return 0;
}//代碼運行結果:
arr1[0]:0x7ffc1d13880c arr1[1]:0x7ffc1d138810 arr1[2]:0x7ffc1d138814
數組的常見問題
數組作為函數的形參,要注意什么?
數組作為函數的形參實現上傳遞的是數組的首地址,如果是要做函數中對數組進行遍歷的話,記得一定要把數組的長度一起傳遞過去;
在主函數定義處中:arr表示的是完整的數組;
在函數中:arr只是一個變量,用來記錄數組的首地址;
數組的索引越界:數組的最小索引為:0 ;數組的最大索引為:長度-1;
代碼示例:
#include <stdio.h>
void arr_put(int arr[],int len);//函數聲明
int main()
{int arr1[]={1,2,3,4};int len1=sizeof(arr1)/sizeof(int);arr_put(arr1,len1);return 0;
}
void arr_put(int arr[],int len)//函數封裝:遍歷數組
{for(int i=0;i<len;i++){printf("arr[%d]=%d\t",i,arr[i]);}putchar('\n');
}//代碼運行結果:
arr[0]=1 arr[1]=2 arr[2]=3 arr[3]=4
數組的查找算法
基本查找(順序查找):就是從數組的0索引開始,依次往后查找。找到了返回數據對應索引,如果沒有找到,就會返回-1;
代碼示例:
#include <stdio.h>
void arr_put(int arr[],int len);//函數聲明
int chazhao_arr(int arr[],int len,int num);//函數聲明:查找算法
int main()
{int arr1[]={1,2,3,4};int len1=sizeof(arr1)/sizeof(int);arr_put(arr1,len1);int num1=0;printf("輸入要查找的數據:\n");scanf("%d",&num1);int a=chazhao_arr(arr1,len1,num1);if(a != -1){printf("查找的數據對應索引為:%d\n",a);}else printf("未查找到數據\n");return 0;
}
void arr_put(int arr[],int len)//函數封裝:遍歷數組
{for(int i=0;i<len;i++){printf("arr[%d]=%d\t",i,arr[i]);}putchar('\n');
}
int chazhao_arr(int arr[],int len,int num)//函數封裝:查找算法
{for(int i=0;i<len;i++){if(arr[i] == num){return i;}}return -1;
}//代碼第一次運行結果:
arr[0]=1 arr[1]=2 arr[2]=3 arr[3]=4
輸入要查找的數據:
2
查找的數據對應索引為:1//代碼第二次運行結果:
arr[0]=1 arr[1]=2 arr[2]=3 arr[3]=4
輸入要查找的數據:
6
未查找到數據
數組的排序算法
冒泡排序算法:相鄰的數據兩兩比較,小的放前面,大的放后面
1.相鄰的元素兩兩比較,大的放右邊,小的放左邊
2.第一輪結束,最大值已經找到,在數組的最右邊
3.第二輪結束只要在剩余的元素找最大值就可以
4.第三輪結束只要在剩余的元素找最大值就可以
5. ……
6. 全部排序完
細節:如果數組中有N個數據,總共我們z只用執行N-1輪的比較代碼就可以
?第一輪比較完畢后,最大值就已經確定,第二輪可以少循環一次,后面以此類推
代碼示例:
#include <stdio.h>
void arr_put(int arr[],int len);//函數聲明
void arr_min_max(int arr[],int len);//函數聲明:排序算法從小到大排序
int main()
{int arr1[5]={88,66,775,958,12};//定義數組int len1=sizeof(arr1)/sizeof(int);arr_put(arr1,len1);//數組遍歷arr_min_max(arr1,len1);//數組排序arr_put(arr1,len1);//數組遍歷
}
void arr_put(int arr[],int len)//函數封裝:遍歷數組
{for(int i=0;i<len;i++){printf("arr[%d]=%d\t",i,arr[i]);}putchar('\n');
}
void arr_min_max(int arr[],int len)//函數封裝:排序算法從小到大排序
{for(int i=0;i<len-1;i++)//比較的輪數,減一是因為最后一次不需要比較{int temp=0;for(int j=0;j<len-1-i;j++)//相鄰比較,減i減1是因為每輪比較都以排除一個數據,提升效率{if(arr[j]>arr[j+1]){temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}
}//代碼運行結果:
arr[0]=88 arr[1]=66 arr[2]=775 arr[3]=958 arr[4]=12
arr[0]=12 arr[1]=66 arr[2]=88 arr[3]=775 arr[4]=958
選擇排序算法:從0索引開始,拿著每一個索引上的元素跟后面的元素依次比較,大的放前面,小的放后面,以此類推;
代碼示例:
#include <stdio.h>
void arr_put(int arr[],int len);//函數聲明
void arr_max_min(int arr[],int len);//函數封裝:選擇排序從大到小排序
int main()
{int arr1[5]={88,66,775,958,12};int len1=sizeof(arr1)/sizeof(int);arr_put(arr1,len1);arr_max_min(arr1,len1);arr_put(arr1,len1);
}
void arr_put(int arr[],int len)//函數封裝:遍歷數組
{for(int i=0;i<len;i++){printf("arr[%d]=%d\t",i,arr[i]);}putchar('\n');
}void arr_max_min(int arr[],int len)//函數封裝:選擇排序從大到小排序
{for(int i=0;i<len-1;i++){int temp=0;for(int j=i+1;j<len;j++){if(arr[i]<arr[j]){temp=arr[i];arr[i]=arr[j];arr[j]=temp;}}}
}//代碼運行結果:
arr[0]=88 arr[1]=66 arr[2]=775 arr[3]=958 arr[4]=12
arr[0]=958 arr[1]=775 arr[2]=88 arr[3]=66 arr[4]=12
數組練習題
通過本章的學習,接下來就是進入實戰環節,小伙伴們開始攻略C語言數組(冒泡/選擇排序和查找算法)練習題啦!小伙伴們先嘗試自己敲代碼敲完后在來查看代碼示例呦!
數組(求最值)
題目:已知數組元素為:{33,5,22,44,55},請找出數組中最大值并打印在控制臺上
#include <stdio.h>
int max_out(int arr[],int len);
int main()
{int arr[5]={33,5,22,44,55};int len=sizeof(arr)/sizeof(int);int max=max_out(arr,len);printf("max=%d\n",max);return 0;
}
int max_out(int arr[],int len)//函數封裝:找最值
{int max=0;for(int i=0;i<len;i++){if(max<arr[i]){max=arr[i];}}return max;
}
數組(求和)
題目:生成10個1~100之間的隨機數存入數組
1.求出所有數據的平均數
2.統計有多少個數據比平均值小
代碼示例:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int sum_out(int arr[]);
int main()
{srand(time(NULL));//生成種子int arr[10];for(int i=0;i<10;i++){arr[i]=rand()%100+1;printf("arr[%d]=%d\n",i,arr[i]);}int sum=sum_out(arr);printf("和為:%d\n",sum);int count=sum/10;printf("平均值為:%d\n",count);int count1=0;//統計比平均值小的變量;for(int i=0;i<10;i++){if(arr[i]<count){printf("%d比平均值小\n",arr[i]);count1++;}}printf("一共有%d個數字比平均值小\n",count1);return 0;
}
int sum_out(int arr[])//求數組的和
{int sum=0;for(int i=0;i<10;i++){sum+=arr[i];}return sum;
}
數組(反轉數組)
題目:鍵盤錄入五個數據并存入數組,完成以下需求
1.遍歷數組
2.反轉數組
3.再次遍歷
代碼示例:
#include <stdio.h>
void bianli_arr(int arr[],int len);
int main()
{printf("輸入五個數據\n");int arr[5];for(int i=0;i<5;i++){scanf("%d",&arr[i]);}bianli_arr(arr,5);int temp=0;for(int i=0;i<5/2;i++){temp=arr[i];arr[i]=arr[4-i];arr[4-i]=temp;}bianli_arr(arr,5);return 0;
}
void bianli_arr(int arr[],int len)
{for(int i=0;i<len;i++){printf("arr[%d]=%d ",i,arr[i]);}printf("\n");
}
數組(替換)
題目:定義一個5個成員整型數組data[]={10,22,88,66,88},將所有的88替換成666
代碼示例:
#include<stdio.h>
int main()
{int arr[]={10,22,88,66,88};int len=sizeof(arr)/sizeof(int);for(int i=0;i<len;i++){if(arr[i] == 88){arr[i]=666;}}for(int i=0;i<len;i++){printf("%d ",arr[i]);}return 0;
}
數組(統計)
題目:定義一個5個成員整型數組data[]={10,22,88,66,88},統計88的個數
代碼示例:
#include<stdio.h>
int main()
{int arr[]={10,22,88,66,88};int len=sizeof(arr)/sizeof(int);int count=0;for(int i=0;i<len;i++){if(arr[i] == 88){count++;}}printf("88出現的個數有%d個\n",count);return 0;
}
數組(正向/逆向排序)
題目:定義一個5個成員整型數組,從鍵盤上獲取5個整數,輸出數組所有成員(正向和逆向);輸出最大值,最小值和平均值;
代碼示例:
#include<stdio.h>
void arr_bianli(int arr[],int len);
int main()
{int arr[5];printf("輸入五個數:\n");for(int i=0;i<5;i++){scanf("%d",&arr[i]);}/*從大到小排序*/for(int i=0;i<4;i++){for(int j=0;j<4-i;j++){if(arr[j]<arr[j+1]){arr[j]=arr[j+1]^arr[j];arr[j+1]=arr[j]^arr[j+1];arr[j]=arr[j]^arr[j+1];}}}arr_bianli(arr,5);/*從小到大排序*/for(int i=0;i<4;i++){for(int j=0;j<4-i;j++){if(arr[j]>arr[j+1]){arr[j]=arr[j+1]^arr[j];arr[j+1]=arr[j]^arr[j+1];arr[j]=arr[j]^arr[j+1];}}}arr_bianli(arr,5);printf("最小值為:%d\t最大值為:%d\n",arr[0],arr[4]);int sum=0;for(int i=0;i<5;i++){sum+=arr[i];}printf("平均值為:%d\n",sum/5);return 0;
}
void arr_bianli(int arr[],int len)//函數封裝:循環打印遍歷數組
{for(int i=0;i<len;i++){printf("%d ",arr[i]);}printf("\n");
}
制作不易!喜歡的小伙伴給個小贊贊!喜歡我的小伙伴點個關注!有不懂的地方和需要的資源隨時問我喲!