2012-12-20 18 views
0

我有傳遞數組作爲參數起作用的疑問,如下面我的代碼,傳遞數組作爲參數起作用

#include <stdio.h> 
    #include <string.h> 

    void str_cpy(char a[], char b[]) 
    { 
    a = b; 
    printf("%s\n", a); 
    } 

    int main() 
    { 
    char a[] = "hello"; 
    char b[] = "world"; 

    str_cpy(a, b); 
    printf ("%s\n", a); 
    return 0; 
    } 

在上面的代碼我傳遞數組功能是通過參考通因此它應該在主函數中打印「世界」,因爲我在函數定義中將b的值賦給a a a = b,但它不是,所以請幫助我..

+0

***通過參考***,你沒有'C'。 –

+2

@VincenzoPii即使這樣做,數組也不能在C或C++中賦值 – Praetorian

回答

0

您將其解釋爲錯誤的,它實際上pass by value

void str_cpy(char a[], char b[]) // it's same as str_cpy(char *a,char *b) 
    { 
    a = b; 
    printf("%s\n", a); // here it will print "world" because it's a local 
       // change in a but actually in main a still contains "hello" 
    } 

由於您使用<string.h>你可以直接使用strcpy(a,b);

或者,嘗試這樣的事情由字符複製到字符目標陣列。

str_cpy(char *a,char *b) 
{ 
while(*b != '\0') 
    { 
    *a=*b; 
    a++; 
    b++; 
    } 
} 

但是,如果陣列a沒有足夠的空間來保存複製的字符可能是一個問題。

+0

兩者都是通過價值,都通過'a'和'b'的地址值.. –

+0

@AdeelAhmed:是啊..所以當我說它不通過價值 – Omkant

+0

@AdeelAhmed:其實..由於第一行..「你做錯了」..從那裏你可能已經推斷出,但我的意思是別的..現在編輯。這是由於英語不好,不介意 – Omkant

2

當您將數組傳遞給函數時。它作爲指向數組第一個元素的指針衰減。

您的功能str_cpy()只將傳遞的指針a指向另一個指針b。它不會修改原始字符數組a的內容。請注意,指針ab是本地函數。

另外,還要注意對數組的基本規則是:
「數組是不可轉讓的,你必須每個元素陣列複製。」

你的代碼是equivalent to

char a[] = "hello"; 
char b[] = "world"; 

char *ptr1 = a; 
char *ptr2 = b; 

ptr1 = ptr2; 

printf("[%s]",a); 

它不會改變原來的數組中的內容,它僅僅指出這是指向數組有些另一個數組的指針。

將一個陣列的每個元素複製到另一個陣列是strcpy()提供的功能。您應該簡單地使用標準庫提供的功能。

1

str_cpy()功能可以寫成:

這是語義上等同於你寫什麼;在你寫的和我寫的內容之間沒有操作上的區別。數組作爲指針傳遞給數組的第一個元素。他們很方便地初始化本地指針變量。在該功能範圍內,您將a指向b所做的相同位置,但這不會影響main()程序中的陣列。

要複製圍繞C數組,你必須每個元素依次複製:

void str_cpy(char *a, char *b) 
{ 
    while ((*a++ = *b++) != '\0') 
     ; 
    printf("%s\n", a); 
} 
+0

如果'a'沒有足夠的空間保存完整的字符串,該怎麼辦? – Omkant

+0

@Omkant:那你就有問題了。無論如何你都有問題。現在你已經有了一個不同的。 –