初學c課程筆記整理6 陣列

2022-03-14 02:22:54 字數 4497 閱讀 3076

是什麼?有什麼用?用在什麼地方?(理解)

養成良好的程式設計習慣;

培養程式設計思想;

寫**之前應該先分析需求,分析完需求再開始寫**;(寫注釋)

1.陣列的定義

陣列的定義格式:

資料型別 變數名稱;

資料型別 陣列名稱[資料的個數];

元素型別 陣列名稱[元素個數];

元素型別: 就是陣列中需要儲存的資料型別, 一旦指定, 陣列中就只能儲存該型別的資料

元素個數: 就是陣列中能夠儲存的資料(元素)的個數

int scores[3];

// 定義了乙個名稱叫做scores的陣列, 陣列中可以存放3個int型別的資料

scores = 12; // 系統搞不清楚應該賦值給誰

只要定義乙個c語言的陣列,

系統就自動會給陣列中的每一塊小得儲存空間乙個編號

這個編號從0開始, 依次遞增

陣列中系統自動繫結的編號, 我們稱之為 索引

3.陣列的初始化

需求保持全班101個人的分數

定義陣列:

元素型別 陣列名稱[元素個數];

/*// 先定義再初始化

int scores[5];

scores[0] = 99;

scores[1] = 88;

scores[2] = 77;

scores[3] = 66;

scores[4] = 100;

*/// 依次將{}中的每乙個值賦值給陣列中的每乙個元素

// 並且從0開始賦值

// 也稱之為陣列的初始化(完全初始化)

int scores[5] = ;

// 部分初始化

// 預設從0開始初始化, 依次賦值

// 注意: 如果"在部分初始化中"對應的記憶體沒有被初始化, 那麼預設是0

int scores1[3] = ;

printf("0 = %i\n", scores1[0]);

printf("1 = %i\n", scores1[1]);

printf("2 = %i\n", scores1[2]);

⚠️陣列注意事項

在定義陣列的時候裡面只能寫整型常量或者是返回整型常量的表示式

⚠️注意: 如果沒有對陣列進行初始化(完全和部分), 那麼不要隨便使用陣列中的資料, 可能是一段垃圾資料(隨機值)

⚠️注意: 定義陣列的時候, 陣列的元素個數不能使用變數, 如果使用變數, 那麼陣列中是一些隨機值

⚠️注意: 不建議使用變數定義陣列, 如果使用了變數定義陣列, 作為陣列的元素個數, 不初始化的情況下是隨機值, 如果初始化會直接報錯

⚠️注意: 如果定義的同時進行初始化, 那麼元素的個數可以省略

省略之後, 初始化賦值幾個資料, 那麼陣列的長度就是幾. 也就是說陣列將來就能儲存幾個資料

int scores5 = ;

printf("0 = %i\n", scores5[0]);

printf("1 = %i\n", scores5[1]);

printf("-------\n");

⚠️注意; 如果定義陣列時沒有進行初始化, 那麼不能省略元素個數

可以通過[索引] = 的方式, 給指定索引的元素賦值

int socres7[101] = ;

printf("3 = %i\n", socres7[99]);

printf("4 = %i\n", socres7[100]);

⚠️注意: 只能在定義的同時利用{}進行初始化, 如果是先定義那麼就不能使用{}進行初始化

如果先定義那麼就不能再進行整體賦值, 只能單個賦值

4.陣列的遍歷

取出陣列中所有的值, 稱之為遍歷

⚠️注意: 在遍歷陣列的時候, 盡量不要把遍歷的次數寫死

遍歷多少次應該由陣列來決定, 也就是說遍歷多少次應該通過陣列計算得出

printf("scores = %lu\n", sizeof(scores));

// 計算出陣列占用的總位元組數

printf("scores[0] = %lu\n", sizeof(scores[0]));

// 計算出陣列中某乙個元素占用的位元組數

printf("乙個有多少個元素 : %lu\n",

sizeof(scores) / sizeof(scores[0]));

// 動態計算陣列的元素個數

int length = sizeof(scores) / sizeof(scores[0]);

// 陣列的遍歷

for (int i = 0; i < length; i++)

return 0;

5.陣列的記憶體分配

1.陣列內部儲存細節

儲存方式:

1)計算機會給陣列分配一塊連續的儲存空間

2)陣列名代表陣列的首位址,從首位址位置,依次存入陣列的第1個、第2個....、第n個元素

3)每個元素占用相同的位元組數(取決於陣列型別)

4)並且陣列中元素之間的位址是連續

⚠️注意:字元在記憶體中是以對應ascii值的二進位制形式儲存的,而非上表的形式。

在這個例子中,陣列x的位址為它的首元素的位址0x08,陣列ca的位址為0x03

2.陣列的位址

- 在記憶體中,記憶體從大到小進行定址,為陣列分配了儲存空間後,陣列的元素自然的從上往下排列 儲存,整個陣列的位址為首元素的位址。

陣列a的位址是ffc1,a[0]的位址是ffc1,a[1]的位址是ffc5

因此a == &a[0],即第乙個元素的位址就是整個陣列的位址

3.陣列的越界問題

陣列越界導致的問題

約錯物件

程式崩潰

char cs1[2] = ;

char cs2[3] = ;

cs2[3] = 88; // 注意:這句訪問到了不屬於cs1的記憶體

printf("cs1[0] = %d\n", cs1[0] );

輸出結果: 88

6.陣列與函式

基本資料型別作為函式的引數是值傳遞

如果形參是基本資料型別, 在函式中修改形參的值不會影響到實參的值

⚠️注意1: 陣列名作為函式的引數傳遞, 是傳遞的陣列的位址

因為陣列名就是陣列的位址 &number = &number[0] == number

⚠️注意2: 如果陣列作為函式的形參, 元素的個數可以省略

如果形參是陣列, 那麼在函式中修改形參的值, 會影響到實參的值

如果傳遞的陣列的名稱, 其實傳遞的是位址

如果傳遞的是位址, 其實傳遞的是指標

指標在64位編譯環境佔8個位元組

⚠️注意: 如果陣列作為形參, 那麼在函式中就不能通過陣列的名稱計算出陣列元素的個數

因為系統會自動將陣列形參轉換為指標, 指標占用8個位元組

陣列的一些練習的函式封裝:

選擇排序、

氣泡排序

// 遍歷陣列

void printarray(int nums, int length)

}//選擇排序

void selectsort(int nums, int length)}}

//    輸出選擇排序後的排列

printarray(nums,length);

}//氣泡排序

void bubblesort(int nums, int length)}}

//    輸出氣泡排序後的排列

printarray(nums, length);

}折半查詢

//    遍歷陣列

int findkye(int nums, int length, int value)

}return -1;

}//折半查詢

int findkey2(int nums, int lengh, int value)

//         要查詢的值比中位值小,則中位變最小位並+1

else if (nums[min] < value)

//        相等則返回下標

else

}//    要查詢的值不存在便返回-1

return -1;

}進製查表法

void total(int value, int base, int offset)

;// 2.定義乙個陣列, 用於儲存查詢後的結果

char results[32] = ;

// 3.定義乙個變數, 用於記錄當前需要儲存到查詢結果陣列的索引

int pos = sizeof(results)/ sizeof(results[0]);

while (value != 0)

// 4.列印結果

for (int i = pos; i < 32; i++)

printf("\n");

}

初學c課程筆記整理1 概念初解

是什麼?有什麼用?用在什麼地方?理解 養成良好的程式設計習慣 培養程式設計思想 寫 之前應該先分析需求,分析完需求再開始寫 寫注釋 1.關鍵字 系統定義 被c語言賦予了特殊含義的單詞,關鍵字特徵 全部都是小寫 關鍵字在開發工具中會顯示特殊顏色 編譯器嚴格區分大小寫 注意 關鍵字不能用作變數名 函式名...

(C )陣列初學筆記

include iostream using namespace std int main int arr2 5 輸出陣列資料時可以使用for迴圈 for int i 0 i 5 i return0 第一種需要使用 arr 0 1 這種方式進行賦值 當賦值數小於陣列長度時,未賦值陣列預設為0 可以統...

課程筆記 優秀課程筆記整理

目錄 cs231n 李巨集毅老師機器學習課程 pytorch學習筆記 深度學習概述 神經網路基礎之邏輯回歸 神經網路基礎之python與向量化 淺層神經網路 深層神經網路 深度學習的實用層面 優化演算法 超引數除錯 batch正則化和程式設計框架 機器學習策略 上 機器學習策略 下 卷積神經網路基礎...