[源碼下載]
作者:webabcd
介紹
不可或缺 Windows Native 之 C 語言
示例
cArray.h
#ifndef _MYHEAD_ARRAY_ #define _MYHEAD_ARRAY_ #ifdef __cplusplus extern "C" #endif char *demo_cArray(); #endif
cArray.c
/* * 數組 * * * 定義數組,int ary[10],相關說明如下: * 1、int 是數據元素的數據類型,10 是數組元素個數,系統會根據數組元素的數據類型和元素個數來分配內存空間 * 2、整個數組是以首地址開頭的一塊連續的內存單元 * 3、數組名 ary 就代表了該數組的首地址,也就是說 ary 相當於 &ary[0] */ #include "pch.h" #include "cArray.h" #include "cHelper.h" char *demo_cArray() { // 定義並初始化一個數組 // int ary[] = { 0, 1, 2, 3, 4 }; // 定義一個長度為 10 的數組,並初始化前 5 個元素,其他元素默認為 0 // 注:定義數組的長度時必須用常量,不能用變量(注:ANSI C99 是允許用變量定義局部數組大小的) int ary[10] = { 0, 1, 2, 3, 4 }; // 修改數組中某一個元素的值(注:只能對數組的元素賦值,而不能用賦值語句對整個數組賦值) ary[8] = 0; // sizeof(ary) - 數組 ary 占用的內存空間 // 由於 ary 是一個整型數組,而每個整型數據占用 sizeof(int) 個字節的空間,則數組元素的個數為 sizeof(ary) / sizeof(int) int count = sizeof(ary) / sizeof(int); for (int i = 0; i < count; i++) { int x = ary[i]; } // 指定行數(一維長度)和列數(二維長度)定義一個二維數組,並初始化 int ary2[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } }; // 修改二維數組中某一個元素的值 ary2[0][1] = 2; // 初始化二維數組時,也可以一行一行地按順序寫入數據,如下。其結果同上 // int ary2[3][2] = { 1, 2, 3, 4, 5, 6 }; // 定義二維數組時,可以省略行數(一維長度),如下。其結果同上 // int ary2[][2] = { 1, 2, 3, 4, 5, 6 }; // 遍歷二維數組 for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { int x = ary2[i][j]; } } // 定義一個字符數組,並初始化 // char aryStr[] = { 'i', ' ', 'a', 'm', ' ', 'w', 'e', 'b', 'a', 'b', 'c', 'd' }; // 長度12,占用空間12 // 定義一個字符數組,並按字符串的形式對其初始化 // char aryStr[] = { "i am webabcd" }; 同 char aryStr[] = "i am webabcd"; // 長度12,占用空間13 // 以字符串的形式賦值給字符數組時,會自動在結尾處多加一個字符串結束符,即'\0',用於標記字符串結束(字符串的結束標識為:'\0',即 ASCII 碼中的 0,也就是 NULL) char aryStr[] = "i am webabcd"; // 字符串長度 int length = strlen(aryStr); // 12 // 字符串占用的內存空間(如果 aryStr 賦值給別人,或當做參數傳遞時,其就表現為數組的首地址了,如果再對其 sizeof 的話,取得的就是指針所占用的內存空間的大小) int memory = sizeof(aryStr); // 13 /* * 注意: * 1、此處通過 sizeof(aryStr) 獲取到的是數組的空間占用,通過 strlen(aryStr) 獲取到的是數組的長度 * 2、然而之前我們說過,數組名 aryStr 就是數組的首地址,整個數組是以首地址開頭的一塊連續的內存單元 * 3、當我們把 aryStr 賦值給別人(比如 char *s = aryStr;),或當做參數傳遞時,其就表現為數組的首地址了。比如在對應的形參中,如果 sizeof(ary) 的話,其得到的是指針占用的內存空間的大小 */ /* * 另: * 1、如果你知道了一個字符串的首地址,那麼你就知道這個字符串的長度,因為它會以“0”結尾 * 2、如果你知道一個普通數組的首地址,那麼你是不知道這個數組的長度的,因為你不知道它在哪裡結尾 */ // 寫到數組了,就用“冒泡排序”舉個例子吧 // 記得以前去某公司 C# 筆試,題目是對一個數組排序,我寫的是 /* int[] ary = { 1, 9, 5, 6, 3 }; ary = ary.OrderBy(p => p).ToArray(); */ // 結果面試官說這個不對... void bubble_sort(int ary[], int length); int ary_int[] = { 14, 80, 19, 6, 26, 2 }; bubble_sort(ary_int, 6); // 2, 6, 14, 19, 26, 80 return str_concat2(int_toString(length), int_toString(memory)); } // 冒泡排序算法 void bubble_sort(int ary[], int length) { for (int i = 0; i < length - 1; i++) { bool sorted = true; for (int j = 0; j < length - 1 - i; j++) { if (ary[j] > ary[j + 1]) { sorted = false; int temp = ary[j]; ary[j] = ary[j + 1]; ary[j + 1] = temp; } } if (sorted) break; } } /* 寫到 for 循環,然後發現一個事情 for(int i=0;;) 這個在 C99 下是合法的 而以前的標准 for(int i=0;;) 是不合法的(不能在語句中聲明變量),需要這麼寫 int i; for(i=0;;); */