//陣列做函式引數退化為指標的技術推演
#include#include
#include
//一維陣列做函式引數退化為指標的技術推演
void printfa(char * strarr[3
]);//
計算機中,陣列都是線性儲存,二維陣列元素也是乙個個的排列的
//例如: 1,2,3,4,5,6,7,8,9 像這組資料 我們可以認為是一維陣列 int a[9]=;
//也可以認為是二維陣列 int b[3][3]=;
//所以計算機並不清楚陣列名的步長是多少 就是 a+1移動多少個位元組 或者 b+1 移動多少個位元組
//這就需要程式設計師去告訴計算機 陣列名的步長是多少
//對於本題 void printfa(char * strarr[3]); 陣列做函式引數 該陣列是乙個一維陣列 陣列元素型別是 char *
//那麼陣列strarr的步長應該是 sizeof(char *) 也就是4個位元組
//這麼來說 我們只需要告訴計算機 你跳4個位元組 就ok了
//所以技術推演為printfb
void printfb(char *strarr);
//因為計算機根本不關心你有多少個元素 是3個 還是30個 與計算機沒關係 是程式設計師需要關心的(這就是陣列越界問題)
//函式引數 char * strarr 同樣告訴計算機 我是乙個一維陣列 陣列元素是 char * 型別
//那麼陣列strarr的步長還是 sizeof(char *) 也就是4個位元組
//那麼我們繼續推演 既然計算機只需要確定 該陣列每次移動的步長是 4個位元組就好
//那麼void printfc(char ** strarr);這麼寫也是可以的 strarr是個指標 strarr裡的值指向乙個型別是 char *的變數
//步長只與指標的值有關 ,因此strarr的 步長是 sizeof(char *) 也就是4個位元組
//所以c語言的開發人員就做了優化 printfc (與我沒關係 設計c語言的就是這麼優化的)
void printfc(char **strarr);
//char * strarr[3]做引數退化為char ** strarr) 有2個好處
////
char * strarr[3] 需要耗費 sizeof(char *) * 3 =12 個位元組的記憶體空間 ;
//而char ** strarr需要耗費 sizeof(char **) = 4 個位元組的記憶體空間 ;
//節約了記憶體 和建立 陣列時的資源消耗
//好處2:減少了無用解析 ;對於char * strarr[3] 元素個數3 沒用,
//這是個一維陣列 這個資訊沒用 ,因為遍歷陣列的時候從首位址開始遍歷, 只要給計算機個首位址就行
//計算機從首位址向後遍歷 無需知道他是什麼 只需要知道每次的步長是多少就好了
//二維陣列做函式引數退化為指標的技術推演
void printfd(int arr[3][4
]);//
對於二維陣列,c語言編譯器同樣需要知道 陣列名arr的步長 就是在遍歷的時候 每次計算機改移動多少個位元組
//那麼首先 我們應該確定陣列名arr 到底是個什麼型別
//陣列名 是陣列首元素的指標 (我自己的推論) 那麼二維陣列 可以想象成一維陣列 只是這個一維陣列的每個元素比較特殊,還是乙個一維陣列
//那麼根據推論 陣列名arr的型別是乙個一維陣列的指標 一維陣列是這樣定義的 typedef int myarr[4];
//一維陣列指標的型別定義是這樣的 typedef int (* pmyarr)[4];
//一維陣列指標的變數是這麼定義的int (* pmyarr)[4];
//所以陣列名arr的型別是 int (* pmyarr)[4]; 因為指標的步長與指標所指向的記憶體空間相關
//arr指向的是乙個typedef int myarr[4]型別的陣列,這個陣列有4個元素,每個元素都是int型別
//由此得出arr這個一維陣列指標的步長是 sizeof(int)*4 = 16;
//由 一維陣列的推演可知 陣列元素的個數對c語言編譯器並不重要 二位陣列的元素可以看作一維陣列
//推演出 void printfd(int arr[4]);
void printfe(int arr[4
]);//
又因為 c語言編譯器 只需要知道 首位址 和步長 所以 可以用 int (*p)[4] 來代替 int arr[4]
void printff(int(*arr)[4
]);//
綜合以上分析,匯出結論 陣列做函式引數退化為指標,指標的型別就是陣列名的型別
void
main();
int arr[3][4] = ;
system(
"pause");
}
陣列排序及陣列做函式引數將會退化為指標
陣列排序 1.選擇排序思想 2.選擇排序初級 include include int main int a 10 int k 0 int j 0,i 0,temp 0 printf 排序前 n 排序前列印輸出 for k 0 k 10 k printf d a k printf n for i 0 ...
排序熱身及陣列做函式引數退化為指標引申
先說排序比較常用的是氣泡排序 先介紹個簡單的 氣泡排序的原理就是先獲取到每個陣列的元素 然後迴圈的和自己下乙個去比較 判斷是否大於還是小於 之後做下替換 例 int number 5 先定義乙個陣列 進行排序 for int i 0 i 5 i 他先拿著第乙個數字和下面乙個去比較 第一輪比較下來之後...
從C語言的陣列引數退化為指標談起
contact me blog email cugtyt qq.com,cugtyt gmail.com github cugtyt github 知乎專欄 programming tools 當我們寫下如下 void fun int arr 等同於void fun int arr int a 10...