C語言 陣列做函式引數退化為指標的技術推演

2021-09-08 01:17:50 字數 2503 閱讀 9931

//

陣列做函式引數退化為指標的技術推演

#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...