2011-12-23 55 views
46

Tôi có câu hỏi về một con trỏ tới mảng 2d. Nếu một mảng có dạng làMột con trỏ tới mảng 2d

int a[2][3]; 

thì, đây có phải là con trỏ đến mảng a?

int (*p)[3] = a; 

Nếu điều này đúng, tôi tự hỏi [3] có nghĩa là gì từ int(*p)[3]?

Trả lời

35

Thay vì đề cập đến int[2][3] làm 'mảng 2d', bạn nên coi đó là 'mảng mảng'. Nó là một mảng với hai mục trong đó, trong đó mỗi mục là một mảng với 3 int trong đó.

int (*p)[3] = a; 

Bạn có thể sử dụng p để trỏ đến một trong hai mục trong a. p trỏ đến mảng ba-int - cụ thể là mục đầu tiên như vậy. p+1 sẽ trỏ đến mảng ba-int thứ hai. Để khởi tạo p để trỏ đến phần tử thứ hai, sử dụng:

int (*p)[3] = &(a[1]); 

Sau đây là cách tương đương để trỏ đến đầu tiên của hai mặt hàng này.

int (*p)[3] = a; // as before 
int (*p)[3] = &(a[0]); 
+2

Bạn thậm chí có thể viết '[3] a' chẳng hạn :) Đó là một cách hay để học những mảng trong C thực sự là gì. – vsz

+0

@ vsz, tôi không thể quyết định được điều đó thực sự tuyệt vời hay thực sự điên rồ :-) –

+9

@vsz: Ý bạn là '3 [a]'. –

5

[3] là một phần của loại. Trong trường hợp này, p là một con trỏ tới một mảng có kích thước 3 chứa int.

Loại cụ thể của một mảng luôn bao gồm kích thước của nó, do đó bạn có các loại int *[3] hoặc int *[5], nhưng không chỉ int *[] có kích thước không xác định.

int *x[20]; /* type of x is int *[20], not just int *[] */ 
int y[10][10]; /* type of y is int[10][10], not just int[][] */ 
+0

Cảm ơn nhận xét của bạn. Khi bạn nói kích thước, nó có nghĩa là (* p) có [0], [1]], [2]? Nếu trường hợp này xảy ra, thì đâu là phòng cho [2]? Hay nó trỏ đến [0] [0] và [0] [1]? – user1047092

+0

'p' chỉ đơn giản là một con trỏ tới một mảng gồm 3 int. Nó không biết rằng kích thước đầu tiên của 'a' là 2, bởi vì nó được gán cho phần tử đầu tiên của' a', chính xác là kiểu 'int [3]'. –

8

Nói đúng, không, int (*p)[3] = a; không phải là con trỏ đến a. Nó là một con trỏ đến phần tử đầu tiên của a. Phần tử đầu tiên của a là một mảng gồm ba int. p là một con trỏ tới một mảng gồm ba int.

Một con trỏ đến mảng a sẽ được khai báo như sau:

int (*q)[2][3] = &a; 

Giá trị số của pq có nhiều khả năng (hoặc thậm chí có thể yêu cầu được) giống nhau, nhưng họ là các loại khác nhau. Điều này sẽ được phát khi bạn thực hiện số học trên p hoặc q. p+1 trỏ đến phần tử thứ hai của mảng a, trong khi q+1 chỉ tới bộ nhớ nằm ngoài phần kết thúc của mảng a.

Hãy nhớ rằng: cdecl là bạn của bạn: int a[2][3], int (*q)[2][3].

37
int a[2][3]; 

a được đọc là mảng 2 của mảng 3 của int đơn giản chỉ là mảng mảng. Khi bạn viết,

int (*p)[3] = a;

Nó tuyên bố p như một con trỏ đến các yếu tố đầu tiên mà là một mảng. Vì vậy, p trỏ đến mảng của 3 ints là một phần tử của mảng mảng.

Hãy xem xét ví dụ sau:

 int a[2][3] 
+----+----+----+----+----+----+ 
| | | | | | | 
+----+----+----+----+----+----+ 
\_____________/ 
     | 
     |  
     | 
     p int (*p)[3] 

Ở đây, p là con trỏ của bạn mà chỉ vào mảng của 3 ints đó là một phần tử của mảng của mảng.

+0

wow cảm ơn sự giúp đỡ của bạn. bản vẽ này giúp ích rất nhiều! – user1047092

+10

+1 cho nghệ thuật ASCII. Và chính xác, tôi đoán vậy. –

+0

sẽ không "p" trở thành một mảng của 3 con trỏ nguyên, với giá trị đầu tiên trỏ đến giá trị đầu tiên của "a"? – Matthew

0

Cũng Lưu ý: -

int * p [5] // p là một mảng của 5 con trỏ

int (* p) [5] // điểm p để một loạt các 5 ints

int (* (p + 5)) [10] // p là một con trỏ trỏ đến cấu trúc trong đó phần tử thứ 5 của cấu trúc có 10 int.

+0

Làm cách nào để thêm vào danh sách câu trả lời hữu ích? – rayryeng

+0

OP hỏi một câu hỏi khái niệm và tôi đã trả lời ở đây. Thay cho 5 đặt 3 !. Ngoài ra tôi đã bổ sung thêm chi tiết về cách lấy giá trị từ mảng 2d sử dụng con trỏ. – BigDataScholar

+0

Tôi cho rằng điều này khó hiểu hơn phần còn lại của câu trả lời được cung cấp tại đây. – rayryeng

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