前面了解了c 語言的基礎部分,下面在對它進行一個深入的了解吧!
數組1,一維數組
數組是用來幹嘛的呢?就像我們之前所說的變量一樣,它是用來存儲數據的。那它和變量存儲數據有什麼不同呢?
顯然一個變量隻能保存一份數據,在程序數據量小的情況下,使用起來比較方便。但是對于大規模的數據,單純的變量就有點單薄了,對付大規模的數據,我們需要更強大的數據類型,将衆多的變量凝聚在一起,也就構成了數組。
簡單的來說,數組就是同一類型數據的集合,下面就是定義的簡單數組并對其進行初始化:
int a[5]={10,20}; //部分初始化
int a[5]={[4]=20,[2]=10} //指定初始化
float c=['A'];
int m,g[10]; //若數組和變量的類型一緻,可以放在一起定義
下面通過一個綜合的小案例來加深一下對數組的基本操作。
//要求:由用戶輸入5個整數,保存到數組中,并按逆序打印所有元素。程序如下:
#include<stdio.h>
int main(){
int i,a[5];
printf("Please enter 5 integers:\n");
for(i=0;i<5; i)
scanf("%d",&a[i]); //将i作為下表值,給數組元素賦初值
printf("Print array elements in reverse order:\n");
for(i=4;i>=0;--i)
printf("%d",a[i]); //将i作為下标值,打印數組元素值
return 0;
}
最後呢,對于數組的操作我們一定要切記不要越界訪問,以免訪問到數組之外的内存區域。
2,數組作為函數參數C 語言允許将數組作為函數的參數,即可以将數組名作為函數的實參進行傳遞。可以在參數名後面加上中括号的形式,表示該參數是一個數組類型。如下就是一個以數組為參數的函數PArray:
void PArray(int arr[]){
for(int i=0;i<5;i ){
arr[i]*=10;
printf("%d ",arr[i]);
}
}
C 語言中,幾乎所有的數據類型都可以被定義為數組。由于數組可以用來存儲字符串,因此字符數組在C 語言中的運用極為廣泛。
雖然C 語言中沒有字符串這種數據類型,但它的運用卻極為普遍,比如我們入手的第一個程序"hello world"。注意到,它是用雙引号括起來的一段字符序列。另外,字符串還有一個重要的特征:字符串必須以空字符(用轉義字符'\0'表示)作為結尾。即使是字符串常量,也會隐含地擁有這個空字符。例如:
"abc" //這個字符串是由4個字符構成的,即字符a、b、c以及空字符,它的大小為4個字節
那我們是否會想,如何才能将"abc" 這個字符串存儲到數組中呢?
//方法1:字符式存儲
char str[4]={'a','b','c','\0'}; //全部初始化方式
char str[4]={'a','b','c'}; //鑒于空字符的ASCII碼值為0,也可采用部分初始化的方式
//方法2:字符串式存儲
char str[4]="abc";
//在實際編程中為了避免數組的長度不夠這樣的問題,我們通常建議采用下面這種方式進行賦值:
char str[]="abc";
在看了上述方法2之後,可能我們就在想如何才能得到一個字符串的長度是嗎?
對于字符串,它除了有大小之外,還有長度的概念。我們這裡就簡單的區分一下:
字符串的大小指的是字符串所占内存的字節數,使用sizeof()庫函數計算得出,而字符串長度則是指字符串中有效字符的個數,用strlen()庫函數計算得出。所謂有效字符,就是除去作為結尾标記的空字符以外的字符。
4,二維數組啊,五環,你比六環少一環~,顧名思義,二維數組就是在一維數組的基礎上多了一維,簡單的說就是多了一個"[ ]"。
至于對二維數組的初始化,與一維數組的初始化類似,下面就提一下行初始化方式:
float score[3][3]={
{88.5,86.5,96}, //第1行
{88.5,86.5,96}, //第2行
{88.5,86.5,96}, //第3行
}
前面說過一維數組可以作為函數參數,那類比一下,二維數組肯定也可以作為參數來進行函數調用。與一維數組作為函數參數時需要在參數名跟上一對中括号類似,二維數組需要兩對中括号,其中第一對中括号用于表示第一維的大小,其值可以被省略,即使用空中括号形式;第二對中括号用于表示第二維的大小,其值不可被省略,即必須指明第二維的大小。下面是一個打印二維數組所有元素的函數例子:
void printScore(float s[][4],int len){
for(int i=0;i<len;i ){
for(int j=0;j<4;j )
printf("%6.2f",s[i][j]); //以6字符寬度、保留2位小數的格式打印
printf("\n"); //打印一行元素後進行換行
}
}
最後,我們可以用這樣的思想來理解一下C 語言中的數組:
由普通元素(變量)構成的數組,是一維數組,即一維數組是普通元素(變量)的數組。
由一維數組構成的數組,是二維數組,即二維數組是一維數組的數組。
由二維數組構成的數組,是三維數組,即三維數組是二維數組的數組。
.......
理解了數組的嵌套,再去理解指針與數組的關系,就會比較輕松了 ~ ~
實踐中回顧(總結)理解并掌握數組,會為後面的知識擴展打下堅實的基礎。而真正掌握數組不能光靠理論知識,而是要更多的去實踐,比較經典的題目有矩陣轉置和冒泡排序,下面就用一個經典的冒泡排序算法的實現來對數組的知識進行回顧。
編寫程序,在數組中保存1~100的10個随機整數,對數組進行升序排序,并将排序後的數組元素打印輸出,代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//冒泡排序
void bubble(int a[], int len) {
int i, j, tmp;
//1外層循環會執行 len - 1 次,表示共進行 len - 1 輪的比較過程
for (i = 0; i < len - 1; i) {
/*内層循環用于完成每一輪的比較過程。 它會從待排序序列中的第一個元素開始,逐個和後面的元素進行比較。另外, 随着外層循環中i 值的不斷自增,表達式“len - 1-i”會使内層循環的 執行次數逐漸減少,這相當于把每輪完成後的最大值元素從待排序序列中排除*/
for (j = 0; j < len - 1 - i; j) {
if (a[j]> a[j 1]) //檢查前一個元素是否比後一個元素大 //如果是,就進行兩個元素的值的互換
{
tmp = a[j]; //将前一元素值賦給 tmp
a[j] = a[j 1];//将後一個元素值賦給前一個元素
a[j 1] = tmp;// 将 tmp 值賦給後一個元素
}
}
}
}
int main() {
int i, arr[10]; //設置随機數種子
srand(time(NULL)); //通過循環獲取 10 個随機數,并将其保存到數組arr中
for (i = 0; i < 10; i)
arr[i] = rand() % 100 1; //調用 bubble 函數進行冒泡排序,參數 1 為數組 arr,參數 2 為數組arr 的長度
bubble(arr, 10);
//打印輸出排序後數組中的各元素值
for (i = 0; i < 10; i)
printf("%d ", arr[i]);
return 0;
}
好了,經過上面的回顧,大家是否對C 語言中的數組有了一個更深的印象了呢?
持續分享中······
作者:博客園丨Charmchin
寫在最後:對于準備學習C/C 編程的小夥伴,如果你想更好的提升你的編程核心能力(内功)不妨從現在開始!
編程學習書籍分享:
編程學習視頻分享:
整理分享(多年學習的源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比自己琢磨更快哦!
對于C/C 感興趣可以關注小編在後台私信我:【編程交流】一起來學習哦!可以領取一些C/C 的項目學習視頻資料哦!已經設置好了關鍵詞自動回複,自動領取就好了!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!