詳談C 中陣列作為函式引數

2021-07-06 04:16:26 字數 2100 閱讀 3117

執行以下**,請問輸出是什麼?例子**於《劍指offer》,我對書上例子做了修改,讓其可以執行。

#include

using

namespace

std;

int getsize(int data)

int main() ;

int size1 = sizeof(data1);

int *data2 = data1;

int size2 = sizeof(data2);

int size3 = getsize(data1);

cout

0;}

執行結果如下:

data1是乙個陣列,sizeof(data1)是求陣列的大小。這個陣列包含5個整數,每個整數佔4個位元組,因為總共是20個位元組。data2宣告為指標,儘管它指向了陣列data1,對認真指標求sizeof,得到的結果都是4。在c/c++中,當陣列作為函式的引數進行傳遞時,陣列就自動退化為同型別的指標。因此儘管函式getsize的引數data被宣告為陣列,但它會退化為指標,size3的結果仍然是4.

不能將陣列的內容拷貝給其他陣列作為其初始值,也不能用陣列為其他陣列賦值。

int a = ;   // 含有三個整數的陣列

int s2 = a; // 錯誤:不允許使用乙個陣列初始化另乙個陣列

a2 = a; // 錯誤:不能把乙個陣列直接賦值給另乙個陣列

在c++語言中,指標和陣列有非常緊密的聯絡。使用陣列的時候編譯器一般會把它轉換成指標。

通常情況下,使用取位址符來獲取指向某個物件的指標,取位址符也可以用於任何物件。陣列的元素也是物件,對陣列使用下標運算子得到該陣列指定位置的元素。因此像其他物件一樣,對陣列的元素使用取位址符就能的搭配指向該元素的指標:

string nums = ;  // 陣列元素是string物件

string *p = &nums[0]; // p指向nums的第乙個元素

然而,陣列還有乙個特性:在很多用到陣列名字的地方,編譯器都會自動地將其替換為乙個指向陣列首元素的指標:

string *p2 = nums;                        // 等價於p2 = &nums[0]
在大多數表示式中,使用陣列型別的物件其實是使用乙個指向該陣列首元素的指標。陣列的兩個特殊性質對我們定義和使用作用在陣列上的函式有影響。因為不能拷貝陣列,所以我們無法以值傳遞的方式使用陣列引數。因為陣列會被轉換成指標,所以當我們為函式傳遞乙個陣列時,實際上傳遞的是指向陣列首元素的指標。

儘管不能以值傳遞的方式傳毒陣列,但是我們可以把形參寫成類似陣列的形式:

//儘管形式不同,但這三個print函式是等價的

//每個函式都有乙個const int*型別的形參

void print(const

int*);

void print(const

int);

//這裡的維度表示我們期望陣列含有多少元素,實際不一定

void print(const

int[10]);

儘管表現形式不同,但上面的三個函式是等價的:每個函式的唯一形式都是const int*型別的。當編譯器處理對print函式的呼叫時,只檢查傳入的引數是否是const int*型別:

int i=0,j[2] = ;

print(&i); //正確:&i的型別是int*

print(j); //正確:j轉船成int* 並指向j[0]

如果我們傳給print函式的是乙個陣列,則實參自動地轉換成指向陣列首元素的指標,陣列的大小對函式的呼叫沒有影響。

和其他使用陣列的**一樣,以陣列作為形參的函式也必須確保使用陣列時不會越界。

C語言陣列作為函式引數

一 陣列元素作為函式的實參 陣列元素就是變數,與普通變數沒有區別,將陣列元素傳送給形參,實現單向的值傳遞。include float max float x,float y int main int m a 0 for int i 1 i 6 i printf 陣列中的最大元素是 d m 二 陣列名...

陣列作為函式引數

一 一維陣列名作函式引數 用陣列名作函式引數,應該在主調函式和被調函式分別定義陣列,例如 void main 在被呼叫函式中宣告了形引數組的大小為10,但在實際中,指定其大小是不起任何作用的,因為c語言編譯對形引數組大小不做檢查,只將實參陣列的首元素位址傳給形引數組。形引數組可以不指定大小,在定義陣...

陣列作為函式引數

陣列元素的作用與變數相當,一般來說,凡是變數可以出現的地方,都可以用陣列元素代替。陣列名也可以做實參和形參,傳遞的是陣列第乙個元素的位址。陣列元素可以用作函式實參,但是不能用作形參,因為形參是在函式被呼叫時臨時分配儲存單元的,不可能為乙個陣列元素單獨分配儲存單元 陣列是乙個整體,在記憶體中佔連續的一...