[英]passing Array as argument to function
我對傳遞數組作為函數的參數有疑問,我的代碼如下,
#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;
}
在上面的代碼中,我將數組傳遞給函數是通過引用傳遞,因此它應在主函數中打印“ world”,因為我在函數定義中將b的值賦給a即a = b,但不是,所以請幫忙我 ..
當您傳遞數組以起作用時。 它衰減為指向數組第一個元素的指針。
您的函數str_cpy()
僅將傳遞的指針a
指向另一個指針b
。 它不會修改原始字符數組a
的內容。 請注意,指針a
和b
在函數的本地。
另外,請注意關於數組的基本規則是:
“數組不可分配,您必須復制數組中的每個元素。”
您擁有的代碼等效於 :
char a[] = "hello";
char b[] = "world";
char *ptr1 = a;
char *ptr2 = b;
ptr1 = ptr2;
printf("[%s]",a);
它不會更改原始數組的內容,而只是將指向該數組的指針指向另一個數組。
strcpy()提供的功能是將一個數組的每個元素復制到另一個數組。 您應該只使用標准庫提供的功能。
您的str_cpy()
函數可以寫為:
void str_cpy(char *a, char *b)
{
a = b;
printf("%s\n", a);
}
從語義上講,這等效於您所寫的內容。 你寫的和我寫的沒有操作上的區別。 數組作為指向數組第一個元素的指針傳遞。 它們是方便地初始化的本地指針變量。 在該函數的范圍,你讓a
點到同一個地方b
做,但這並不影響陣列中main()
程序。
要在C中復制數組,您必須依次復制每個元素:
void str_cpy(char *a, char *b)
{
while ((*a++ = *b++) != '\0')
;
printf("%s\n", a);
}
您將其解釋為錯誤,它實際上是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
沒有足夠的空間來保留復制的字符,則可能是一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.