如何系統學習C 語言(中)之 數組篇


前面了解了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]);
	}
}

3,字符數組

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 語言中的數組有了一個更深的印象了呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM