C語言函數參數傳遞


1.值傳遞

void swap(int x,int y)
{
    int temp = x;
    x = y;
    y = temp;
}

void main()
{  
    int a = 10, b = 20;

    swap(a, b);
} 

執行后,並不會交換。

2.引用傳遞

void swap(int &x,int &y)
{
    int temp = x;
    x = y;
    y = temp;
}

void main()
{  
    int a = 10, b = 20;

    swap(a, b);
    printf("a=%d\nb=%d\n", a, b);
} 

執行后,發生交換。

3.指針傳遞

 
void swap(int *x,int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

void main()
{  
    int a = 10, b = 20;


    swap(&a, &b);
    printf("a=%d\nb=%d\n", a, b);
} 

執行后,發生交換。

4.數組做參數,傳的到底是什么?

  參數傳遞只有上面三種,但是如果加上數組,就會產生幾種新形式。 

  首先,明確數組型變量名本身只是該數組所占存儲空間的首地址:

    int a[3] = { 1, 2, 3 };

    int *p = a; //等價於下行
    //int *p = &a[0];

    printf("%d", *p);    

   》》》典型的數組做參數

void fun(char s[]){
    for (int i = 0; s[i] != '\0'; i++)
        printf("%c", s[i]);
}
void main()
{
    char str[] = "Hello World!";

    fun(str);
}

  函數調用時,這里系統不會為形參分配數組存儲空間,而是僅僅分配一個存放數組地址(第一個元素地址)的存儲空間,此后,將實參數組的首地址傳遞給形參變量。其實本質與下相同,只不過還是數組形式的(數組名代替指針)。

  》》》既然數組型變量名本身只是該數組所占存儲空間的首地址,我們當然可以用指針做形參來接收數組實參

 
void fun(char *p){
    while (*p)
    {
        printf("%c", *p);
        p++;
    }    
}
void main()
{
    char str[] = "Hello World!";

    fun(str);
}

  不過問題是如果這樣,無法把握數組結束(除非知道數組長度)。而對於字符數組(上例),由於字符串末尾有結束標志'\0'(ascii碼正好是0),所以就很容易利用指針來判斷字符串是否結束。


免責聲明!

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



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