2010-03-03 43 views
5

chúng ta có thể khai báo hàm trong tệp tiêu đề theo cách sau không?C khai báo hàm

extern int ap(char[][]); 

chúng ta có thể sử dụng char [] [] trong hàm?

+8

tại sao bạn không thử và tìm hiểu. –

+2

@darren: "Đang thử" rất hiếm khi đúng cách để kiểm tra tính hợp lệ của ngôn ngữ. Có khá nhiều nạn nhân của "nó hoạt động trong GCC" ra khỏi đó (cho một ví dụ). – AnT

Trả lời

5

Đối với mảng hai chiều, bạn phải cung cấp kích thước cho kích thước cuối cùng nếu không trình biên dịch không biết cách sử dụng nó. (Đó là tốt để bỏ qua tên mặc dù.)

như thế này:

extern int ap(char[][10]); 
1

Tuy nhiên, nó hoàn toàn hợp lệ để bỏ qua tên tham số trong khai báo hàm. Tuy nhiên, khi bạn xác định chức năng, bạn phải đặt tên cho mảng và sau đó bạn có thể tham chiếu tên đó bằng tên này.

7

Không, bạn cần phải xác định kích thước N-1 cuối cùng cho một mảng.

extern int ap(char[][DIMENSION]); 

Để biết thêm thông tin tìm here

1

Không, đây không được phép - nó cố gắng để khai báo các thông số như một con trỏ tới một kiểu mảng không đầy đủ.

Kiểu mảng phải được hoàn thành với một kích thước, như thế này:

extern int ap(char[][10]); 
4

char[][] không phải là một loại mảng hợp lệ vì bạn không thể có mảng của một loại không đầy đủ, và char[] là không đầy đủ. Tôi biết điều đó gây nhầm lẫn bởi vì bạn thực sự có hai loại mảng, vì vậy đây là một ví dụ khác có cùng vấn đề: char a[3][]. Mảng a có độ dài 3 và loại phần tử là char[], nhưng char[] là, một lần nữa, không đầy đủ và đây là invalid.

Khi bạn có một "mảng đa chiều", bạn thực sự có một mảng các mảng. Ví dụ: typedef int U[3][5]; làm cho U một mảng có chiều dài 3 mảng dài 5 giây và tương đương với typedef int H[5]; typedef H U[3];.

Lý do bạn có thể bỏ qua các khía cạnh bên trái với các thông số chức năng là bởi vì, với các thông số chức năng chỉ, các loại mảng có dạng T[N] được chuyển thành T*, và N có thể được bỏ qua, cho T[]-T*. Điều này chỉ áp dụng ở cấp độ "trên cùng" hoặc "ngoài cùng".

Vì vậy, tất cả những tờ khai chức năng giống hệt nhau:

int f1(int a[3][5]); 
int f2(int a[][5]); 
int f3(int (*a)[5]); 
typedef int T[5]; 
int f4(T a[3]); 
int f5(T a[]); 
int f6(T* a); 

Bạn có thể, tất nhiên, xóa tên tham số một trong bất kỳ tờ khai nêu trên mà không thay đổi chúng.