2014-06-07 18 views
5

Tôi chỉ muốn đảm bảo sự khác biệt giữa * a [5] và (* a) [5] trong ngôn ngữ C.sự khác biệt giữa việc xác định char a [5] và char (* a) [5] là gì?

Tôi biết rằng * a [5] có nghĩa là mảng có thể có năm phần tử và mỗi phần tử là con trỏ. như vậy,

char *p = "ptr1"; 
char *p2 = "ptr2"; 
char *a[5] = { p , p2 }; 

Điều đó có ý nghĩa.

Nhưng khi tôi thay đổi *a[5] thành (*a)[5] nó không hoạt động.

char (*a)[5] = { p , p2}; 

(*a)[5] có nghĩa là gì?


Bên cạnh đó,

có bất kỳ sự khác biệt giữa *a[5]a[5][], và (*a)[5]a[][5]?

Trả lời

3

char *a[5];
tạo một mảng của 5 con trỏ đến char

printf("%c",*a[5])
a là một mảng của con trỏ
nên biểu hiện này có nghĩa là in thứ sáu giá trị nhân vật yếu tố a[5] được trỏ đến.

char (*a)[5]
tạo một mảng của 5 char và gán a địa chỉ của phần tử đầu tiên của mảng tạo này

printf("%c",(*a)[5])
a điểm để các yếu tố đầu tiên của một mảng của nhân vật
Vì vậy, đây biểu hiện phương tiện in giá trị phần tử char thứ sáu của mảng mà a trỏ tới.

5

Họ là những loại khác nhau:

char *a[5]; // array of 5 char pointers. 
char (*a)[5]; // pointer to array of 5 chars. 

Trong ví dụ đầu tiên bạn có một mảng các con trỏ vì khung được ưu tiên khi phân tích cú pháp. Bằng cách đặt dấu hoa thị bên trong dấu ngoặc đơn, bạn ghi đè điều này và đặt con trỏ lên mức ưu tiên cao hơn.

+0

lưu ý rằng OP không viết tuyên bố thứ 2 làm tuyên bố mà là một bài tập. – user2485710

+0

@ user2485710 vâng, tôi nghĩ anh ấy có ý định mặc dù vậy. Nó có ý nghĩa hơn theo cách đó theo ý kiến ​​của tôi. Dù sao, amir đã có một câu trả lời cho trường hợp khác. –

5

Bạn sử dụng dấu ngoặc đơn để làm cho con trỏ chỉ định * "gần hơn" với biến, thay đổi ý nghĩa của khai báo: thay vì một mảng con trỏ, bạn sẽ nhận được một con trỏ đơn lẻ đến một mảng.

Đây là cách bạn có thể sử dụng nó:

char x[5]={'a','b','c','d','e'}; 
char (*a)[5] = &x; 
printf("%c %c %c %c %c\n", (*a)[0], (*a)[1], (*a)[2], (*a)[3], (*a)[4]); 

Lưu ý rằng trình biên dịch biết rằng a trỏ đến một mảng:

printf("%z\n", sizeof(*a)); // Prints 5 

Demo on ideone.

6

Một trang web tuyệt vời tồn tại mà giải mã các nguyên mẫu như vậy: http://cdecl.org/

char *a[5] --> declare a as array 5 of pointer to char 
char a[5][] --> declare a as array 5 of array of char 
char (*a)[5] --> declare a as pointer to array 5 of char 
char a[][5] --> declare a as array of array 5 of char 
Các vấn đề liên quan