陣列引數和指標引數

2021-10-06 19:40:35 字數 1455 閱讀 7701

我們都知道c語言中的陣列引數會退化為指標,那有沒有想過為什麼呢?由於c語言當初開發是為unix作業系統的,對於作業系統來說效率是非常重要的,當引數傳遞的時候如果拷貝整個陣列執行效率將大大下降而且引數位於棧上,太大的陣列拷貝將導致棧溢位,所以會將陣列名看做常量指標傳陣列首元素位址,其實二維陣列引數同樣存在退化的問題,二維陣列可以看做是一維陣列且每個元素是一維陣列,如下

也就是說我們在向乙個函式傳遞陣列引數的時候,必須提供第一維以外的所有維長度,因為第一維以外的維度資訊用於指標運算,n維陣列的本質一維陣列,元素是n-1維的陣列,對於多維陣列的函式引數只有第一維是可變的

#include

#include

void

test

(int a[

3],int row)

}printf

("\n");

}void

test1

(int b[

3][4

],int n)}}

}int

main

(void),

};int aa[2]

[3][

4]=;

test

(a,2);

test1

(aa,2)

;return0;

}

結果:

sice@sice:~$ ./test1

sizeof(a)

= 4sizeof(*a)

= 1212

3456

sizeof(b)

= 4sizeof(*b)

= 4800

0000

0000

0000

0000

0000

00

可以看出從本質上來說c語言只有一維陣列,sizeof(a)和sizeof(b)為4可以看出a,b是退化成指標,sizeof(*a) = 12是其二維陣列的第一行陣列的長度,sizeof(*b)=48是其三維陣列的第一行的長度也就是二維陣列的長度

陣列引數和指標引數的分析

為什麼c語言中的陣列引數會退化為指標?c語言中只會以值拷貝的方式傳遞引數,本質上還是傳值,傳位址也是傳值,只不過傳的是位址值 當向函式傳遞引數時 將整個陣列拷貝乙份乙份傳入函式 錯 將陣列名看做常量指標傳陣列首元素位址對 c語言以高效為最初設計目標,在函式傳遞的時候,如果將拷貝整個陣列執行效率將大大...

陣列引數 和 指標引數 分析

c語言中只會以值拷貝的方式傳遞引數,傳址呼叫本質上也是對位址值的傳遞。當向函式傳遞陣列時,將陣列名看做常量指標傳陣列首元素位址。c語言以高效為最初設計目標,在函式傳遞的時候如果拷貝整個陣列執行效率將大大下降,因此只傳遞首元素的位址。二維陣列引數同樣存在退化的問題,二維陣列可以看做是一維陣列,二維陣列...

25 陣列引數和指標引數分析

目錄c 語言以高效作為最初設計目標 二維陣列引數中第一維的引數可以省略 void f int a 5 void f int a void f int a void g int a 3 3 void g int a 3 void g int a 3 等價關係 陣列退化後,所退化的指標必須能指向原陣列中...