C/C++中傳遞數組參數的問題


我真是太菜了,本來我是今天打算好好搞搞dynamic_programming一系列的經典問題,結果只是停留在把數組連乘的原理給看懂了而已。

原因嘛:

1.當我想要動手實現時,為了給函數和變量起個專業點兒的名字,特意去看了一些細節的命名規范問題;

2.呦西,命名規范解決了,但是名字怎么取才能看起來逼格高一些呢,不是說好的代碼不需要注釋,只看命名就行了么。然后我發現我想表達的變量名字對應的單詞我不會,於是我又去查單詞了;

3.呦西+1,命名總算搞定了,但是這個參考代碼里面,傳遞參數為什么用vector,上次用vector,這次我換到數組吧。然后,我又發現數組傳參的一系列問題我不太熟悉。然后我又開始寫一些小函數測試數組傳參的那些問題去了;

4.現在,代碼沒實現,OJ也沒刷,那就把數組傳參問題先寫下來吧......

 

將數組作為參數進行傳遞

 

有兩種傳遞方法,一種是function(int a[]); 另一種是function(int *a)

這兩種兩種方法在函數中對數組參數的修改都會影響到實參本身的值!

對於第一種,根據之前所學,形參是實參的一份拷貝,是局部變量。但是數組是個例外,因為數組的數據太多了,將其一一賦值既麻煩又浪費空間,所以數組作為參數傳遞給函數的只是數組首元素的地址,數據還是在內存里的,函數在需要用到后面元素時再按照這個地址和數組下標去內存查找。也就是說后面的元素根本沒到函數里來。所以,這里也不能在test()函數內部用sizeof求數組的大小,必須在外面算好了再傳進來

對於第二種,則是傳址調用,無需再說。

這里還有幾點需要注意:

1.在以上兩個函數的形參前面加上const則表示整個數組只讀,而不是只有首地址對應存儲的數據只讀。

2.第二種形式不能用C++11中的for...auto來循環打印。

3.數組的大小要用sizeof()來求,不能用.size(),因為.size()只有struct 或者union才能用, vector算是struct!

4.如果在函數內部又聲明一個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);
    /*這里打印出的a值與test1(),test2()中的p值相等
     *即地址值相同*/
    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");
}

  

總結:

自己這基礎知識真是捉急啊!英語也是糟糕透頂!平時多敲敲代碼吧!多看看英文版書籍吧!! 而不是抄代碼!!要原創原創!!

丫的懂否?! 少吃零食多coding才是真理啊!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM