Vấn đề là gì không phải là về argv
là đặc biệt, nhưng về chức năng lập luận đi qua. Hãy thử chương trình này:
#include<stdio.h>
void foo(int a[])
{
int b[10];
printf("foo :%p %p\n",a,&a);
printf("foo :%p %p\n",b,&b);
}
int main(int argc, char* argv[])
{
int a[10];
printf("main:%p %p\n", a, &a);
foo(a);
return 0;
}
Sản lượng trong máy của tôi:
main:0x7fffb4ded680 0x7fffb4ded680
foo :0x7fffb4ded680 0x7fffb4ded628
foo :0x7fffb4ded630 0x7fffb4ded630
Dòng đầu tiên và thứ ba là không đáng ngạc nhiên vì đối với một mảng arr
, arr
và &arr
có cùng giá trị. Dòng thứ hai cần được giải thích.
Như bạn có thể thấy, khi a
được truyền trong hàm foo
, giá trị của a
là không thay đổi, nhưng địa chỉ &a
được thay đổi kể từ khi chức năng C luôn vượt qua đối số theo giá trị, sẽ có một bản sao cục bộ của các đối số bên trong hàm.
Điều này giống với argv
vì đó chỉ là một đối số trong hàm main
.
EDIT: Đối với những người không đồng ý với tôi, câu trả lời của tôi không phải là chống lại các câu trả lời khác. Ngược lại, họ hoàn thành lẫn nhau. argv
là một con trỏ chính xác bởi vì nó là một mảng được truyền như đối số hàm và nó "phân rã" thành một con trỏ. Một lần nữa, argv
không phải là đặc biệt, nó hoạt động không khác với các mảng khác được chuyển làm đối số hàm, đó là toàn bộ điểm của mã ví dụ của tôi.
Nguồn
2013-08-21 07:37:50
printf ("% d% d", a, &a); tại đây & a và sẽ trỏ đến cùng một địa chỉ ... do đó bạn không cần phải in cả hai và sử dụng% p thay vì% d để in địa chỉ. – sunny1304
Tôi nghĩ thats bởi vì con trỏ argv được khởi tạo nhưng con trỏ của bạn không phải là nó có cùng địa chỉ – Saxtheowl