C語言教程之陣列詳解

2022-09-29 22:15:31 字數 3362 閱讀 9439

目錄

陣列是一組相同型別元素的集合。

陣列的建立方式:

陣列的元素型別 陣列名 [常量表示式];

eg. int arr[5]; char ch[100];

vs編譯器中的易錯點:【】內應為常量表示式

int n = 5;

int arr[n];()

int arr[5];(√)

(其實c99標準之前是不支援使用變數的,只能是常量!

c99中增加了變長陣列的概念,允許陣列大小是變數,而且要求編譯器支援c99標準。

vs對c99的支援就不夠好)

建立的同時給一些初始值叫初始化

int arr[5] = ;

int arr[5] = ;//不完全初始化,剩餘元素預設初始化為0

int arr = ;//未確定大小的陣列根據初始化內容分配空間

char arr1 = ;

char arr2 = "abc";

//sizeof求陣列大小

printf("%d\n", sizeof(arr1));//arr1有三個元素,陣列大小是3個位元組

printf("%d\n", sizeof(arr2));//arr2有四個元素,陣列大小是4個位元組

//strlen求字串長度,遇到 '\0' 才停下

printf("%d\n", strlen(arr1));//陣列末尾沒有『\0',我們沒法知道『\0'會出現在什麼地方,因此arr1的長度是隨機值

printf("%d\n", strlen(arr2));//陣列末尾有『\0',在其之前有三個元素,arr2的長度為3

strlen是乙個庫函式,使用前要加 #include

計算的是字串的長度,並且只針對字串

關注的是字串中是否有\0,計算的是\0之前的字元個數

sizeof是乙個操作符(運算子)

sizeof使用來計算變數所佔記憶體空間大小的,任何型別都可以使用哦

只關注空間大小,不在乎記憶體中是否有\0

陣列是有下標的,第乙個元素下標為0,依次增加

int arr[5] = ;

printf("%d", arr[2]);//是下表訪問操作符,這裡是列印下標為2的數,列印出了3

//列印陣列所有元素,即列印下標為0,1,2,3,4的元素

int i = 0;

int sz = sizeof(arr) / sizeof(arr[0]);//40/4求出元素個數,陣列大小

for (i = 0; i < sz; i++)

int arr[5] = ;

//列印陣列每個元素的位址

int i = 0;

for (i = 0; i < 5; i++)

每兩個位址之間相差4

乙個整型是四個位元組

記憶體中乙個位元組給乙個位址

結論1.一維陣列在記憶體中是連續存放的

2.陣列隨著下標的增長,位址是由低到高變化的

int arr[5] = ;

int i = 0;

int *p = &arr[0];

for (i = 0; i < 5; i++)

可以用首位址+i跳轉到第i個元素位址

因此可以用*(p+i)來得到第i個元素(這個跟之後要講的指標有關係喲,現在先了解一下下)

int arr[3][4];

char arr[3][5];

double arr[2][4];

int arr[3][4];

int arr[3][4] = ;//不完全初始化,不夠就添0

int arr[3][4] = ,};//1 2 0 0

//4 5 0 0

//0 0 0 0

int arr[4] = ,};//二維陣列如果有初始化,行可以省略,列不能省略

//列印二維陣列

int arr[3][4] = ;

int i = 0;

for (i = 0; i < 3; i++)

}//列印陣列每個元素的位址

int arr[3][4] = ;

int i = 0;

for (i = 0; i < 3; i++)

}二維陣列存放看似不連續,實則連續存放

陣列的下標是有範圍限制的。

陣列的下規定是從0開始的,如果陣列有n個元素,最後乙個元素的下標就是n-1

所以陣列的下標如果小於0,或者大於n-1,就是陣列越界訪問了,超出了陣列合法空間的訪問。

c語言本身是不做陣列下標的越界檢查,編譯程式設計客棧器也不一定報錯,但是編譯器不報錯,並不意味著程式就是正確的,

二維陣列的行和列也可能存在越界。

所以程式設計師寫**時,最好自己做越界的檢查

#include

int main()

; for(i=0; i<=12; i++)//在這裡陣列越界訪問了,但這是主要問題嗎?

return 0;

}讓我們公布答案吧!

這段**的bug是死迴圈

很抱歉滿屏的haha吵到了你的眼睛(手動狗頭)

是不是難以想象?請帶著疑惑看看下文解釋

有www.cppcns.com以下幾個規則:

示意圖如下

「由低到高」和「由高到低」相遇了。

arr [12] = 0; 間接改變了i,相當於i = 0;

這樣一來i又從0依次變大再回歸0,實現了死迴圈的局面

至於空白格仔代表的區域性變數儲存時相間隔的的位元組個數是如何確定的,

這得看不同編譯器了。vs編譯器是空兩格,其他編譯器是什麼樣的,感興趣可以自己探索哦。

氣泡排序的核心思想:

相鄰的兩元素進行比較,有需要的話就交換

#include

void bubble_sort(int arr)

} }}int main()

; umimtbubble_sort(arr);//是否可以正常排序?

for(i=0; i

陣列傳參的實質不是傳整個陣列,而是首元素的位址

bubble_sort函式中的sizeof(arr)算出的是指標的大小,因此導致錯誤

arr本質是首元素位址,陣列接收時也可以用int *arr代替int arr

特殊情況:

1.&arr

2.sizeof(陣列名),計算整個陣列的大小,sizeof內部單獨放乙個陣列名,陣列名表示整個陣列

void bubble_sort(int arr, int sz)//引數接收陣列元素個數

} }}int main()

; int sz = sizeof(arr)/sizeof(arr[0]);

bubble_sort(arr, sz);//是否可以正常排序?

for(i=0; i

本文標題: c語言教程之陣列詳解

本文位址:

C語言教程(三)

主要普及c語言的基本語法,本文預設初看的人啥也不懂,如果有程式設計基礎請略過 下面來仔細看一下c編輯器預設給我們生成的 include int main 執行後可以在控制台看見 hello word於是可以做以下嘗試根據程式的變化來逐一了解 的含義 注釋printf hello word n inc...

C語言教程 迴圈

c語言中有2種最常用的迴圈語句 while迴圈 和for 迴圈。while迴圈 while loop while 表示式 程式塊還有乙個變種 do while迴圈,do while 表示式 只要while裡得到表示式是真的,就一直執行程式塊的語句。for迴圈 for loop for 表示式1 表示...

Golang 語言 教程

目錄 golang入門指南 golang教程,設定工作區 go mods hello world golang教程 變數 golang教程 資料型別 數字,字串和布林值 陣列,切片和對映 golang教程 型別轉換 條件語句 if else switch case 迴圈指標 函式可變函式 方法,結構...