2017-07-17 37 views
5

Sự khác biệt giữa hai loại này trong C. Đầu tiên là mảng con trỏ. Sự nhầm lẫn chính của tôi là về tuyên bố thứ hai. Nó tuyên bố cái gì. Không phải là hai giống nhau?Khai báo int (* ar) [] có nghĩa là gì trong C?

int *p []={&i,&j,&k}; 

int (*ar) []; 
+0

Sorry.Edited mà ra. Cảm ơn bạn. – Neer

+2

["khai báo p là mảng con trỏ tới int"] (https://cdecl.org/?q=int+*p+%5B%5D), ["khai báo ar là con trỏ tới mảng int"] (https://cdecl.org/?q=int+%28*ar%29+%5B%5D) – kay

+0

Hãy xem [câu trả lời này] (https://stackoverflow.com/a/30345939/4265352) về một câu hỏi tương tự. – axiac

Trả lời

4

Cả hai không giống nhau. Cách thứ hai là con trỏ tới một mảng là int.

Bạn có thể sử dụng khai báo như một tham số hàm khi truyền một mảng 2D làm tham số. Ví dụ, với chức năng này:

void f(int (*ar)[5]) // array size required here to do pointer arithmetic for 2D array 
{ 
    ... 
} 

Bạn có thể gọi nó là như thế này:

int a[5][5]; 
f(a); 

Một ví dụ khác như một tham số địa phương:

int a[5] = { 1,2,3,4,5 }; 
int (*ar)[]; // array size not required here since we point to a 1D array 
int i; 

ar = &a; 
for (i=0;i<5;i++) { 
    printf("a[%d]=%d\n", i, (*ar)[i]); 
} 

Output:

a[0]=1 
a[1]=2 
a[2]=3 
a[3]=4 
a[4]=5 
+0

Cảm ơn bạn rất nhiều, chúng có thể được khai báo và sử dụng bên trong một hàm (không phải trong tham số) không? Nếu không thì tại sao có một phạm vi để khai báo những thứ như vậy bên trong một hàm. – Neer

+0

@Neer Có, họ có thể. Xem chỉnh sửa của tôi để biết ví dụ. – dbush

6

Chỉ cần theo dõi "right-left" rule

int *p []={&i,&j,&k}; // đọc: "p là một mảng của con trỏ đến int"

int (*ar) []; // "ar là một con trỏ đến một mảng ints"

Các vấn đề liên quan