C++中傳遞陣列引數
C++中傳遞陣列引數
將陣列作為引數進行傳遞有兩種傳遞方法,一種是function(int a[]); 另一種是function(int *a)。這兩種兩種方法在函式中對陣列引數的修改都會影響到實參本身的值!
對於第一種,根據之前所學,形參是實參的一份拷貝,是區域性變數。但是陣列是個例外,因為陣列的資料太多了,將其一一賦值既麻煩又浪費空間,所以陣列作為引數傳遞給函式的只是陣列首元素的地址,資料還是在記憶體裡的,函式在需要用到後面元素時再按照這個地址和陣列下標去記憶體查詢。也就是說後面的元素根本沒到函式裡來。所以,這裡也不能在test()函式內部用sizeof求陣列的大小,必須在外面算好了再傳進來。
對於第二種,則是傳址呼叫,無需再說。
這裡還有幾點需要注意:
- 在以上兩個函式的形參前面加上const則表示整個陣列只讀,而不是隻有首地址對應儲存的資料只讀。
- 第二種形式不能用C++11中的for...auto來迴圈列印。
- 陣列的大小要用sizeof()來求,不能用.size(),因為.size()只有struct 或者union才能用, vector算是struct!
- 如果在函式內部又宣告一個int* tmp型別的變數,然後把p賦值給tmp, 通過tmp修改數陣列也是一樣,都會修改實參本身!
測試程式碼如下:
#include <stdio.h>
#include <algorithm>
using namespace std;
void test1(int[], int size);
void test2(int *p, int size);
//void test2(const int *p, int size);
int main(void)
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int size = sizeof(a)/sizeof(int);
/*
*即地址值相同*/
printf("%p \n", a);
//test1(a, size);
test2(a, size);
int i;
printf("main: ");
for(i = 0; i < size; ++i)
{
printf("%d ", a[i]);
}
}
void test1(int p[], int size)
{
printf("%p \n", p);
p[4] = 111;
printf("test1: ");
int i;
for(i = 0; i < size; ++i)
{
printf("%d ", p[i]);
}
printf("\n");
}
void test2(int *p, int size)
{
printf("%p \n", p);
*(p+4) = 222;
printf("test2: ");
int i;
for(i = 0; i < size; ++i)
{
printf("%d ", *(p+i));
}
printf("\n");
}