Bạn phải sử dụng các loại nhất quán cho các đối tượng được khai báo trên các đơn vị dịch khác nhau.
Cho int a[] = {2, 3};
, một trong các tờ khai extern int a[];
hoặc extern int a[2]
; sẽ tương thích trong khi extern int *a;
sẽ không phải là con trỏ và mảng là các loại hoàn toàn riêng biệt.
Một trong những điều đặc biệt về mảng là khi tên của một mảng xuất hiện trong bất kỳ bối cảnh biểu hiện khác hơn là như một toán hạng để "địa chỉ của" (unary &
) hoặc sizeof
, họ sẽ được tự động chuyển đổi sang một con trỏ đến đầu tiên của họ thành phần.Đây là những gì cung cấp khả năng tương thích cú pháp giữa các mảng và con trỏ, nhưng chúng không cùng loại.
Hãy xem xét hai hàm này cho ví dụ đã nhận xét. Lưu ý rằng biểu thức a
được chuyển đổi thành con trỏ thành phần tử đầu tiên trong phần thứ hai (và thứ ba về mặt kỹ thuật) printf
của hàm đầu tiên, nhưng không phải trong số printf
đầu tiên trong đó toán hạng là &
.
#include <stdio.h>
void print_array_info(void)
{
extern int a[];
printf("address of a: %p\n", (void*) &a); // prints address of a
printf(" converted a: %p\n", (void*) a); // prints address of a[0]
printf("value of a[0]: %x\n", a[0]); // prints value of a
}
void print_pointer_info(void) {
extern int a[];
int *b = a; // == &a[0]
printf("address of b: %p\n", (void*) &b); // prints address of b
printf(" value of b: %p\n", (void*) b); // prints value of b (== &a[0])
printf("value of b[0]: %x\n", b[0]); // prints value of b[0] (== a[0])
}
Lưu ý rằng tôi sử dụng %p
để in con trỏ và rõ ràng đúc để void*
.
Nguồn
2012-06-23 09:22:30
Bạn đang sử dụng hệ điều hành 64 bit? –
@PaulR Tôi sử dụng 32 bit ubuntu 12.04 –