將陣列作為引數進行傳遞有兩種傳遞方法,一種是
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
#include
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 size = sizeof(a)/sizeof(int); /*
這裡列印出的a值與
test1(),test2()中的p
值相等
*即位址值相同*/
printf("%p \n", a);
//test1(a, size);
test2(a, size);
int i;
printf("main: ");
for(i = 0; i < size; ++i)
} void test1(int p, int size)
printf("\n"); }
void test2(int *p, int size)
printf("\n"); }
C 中陣列引數傳遞
include 傳遞陣列引數的幾種方式 void printvalues const int a 10 void printvalues2 int a 10 控制邊界 方法1 void printvalues4 int start,int end void printvalues5 const in...
C P Invoke中傳遞陣列引數
c 在呼叫動態庫介面,有時需要在c 中分配非託管記憶體,以便動態庫可以寫入返回的資料 有時我們需要傳遞乙個複雜的陣列等等。在c 的方法原型中,是乙個 即指標,在c 的方法原型,相對應的可以是intptr,有些也可以直接使用 out,in 等屬性。對於基礎陣列的陣列,可以使用 byte photoda...
C 陣列作引數傳遞
這幾天自己寫了乙個 d3d畫圖的類 很短 都沒幾行 除錯 沒有錯誤但是執行的時候卻 一直不會出影象不知道怎麼回事 最後只有慢慢改 不用類 和 類 結合起來慢慢除錯 最後 終於找到了 原因 今天一直坐在電腦前 對這短短的幾行 卻就是不知道 錯了 真鬱悶啊 不過最後除錯出來還不錯 c 裡面陣列作引數傳遞...