2012-12-23 5 views
8

thể trùng lặp:
Passing a pointer representing a 2D array to a function in C++Làm thế nào để vượt qua một mảng 2ngày qua con trỏ trong c

Tôi cố gắng để vượt qua mảng 2 chiều tôi đến một chức năng thông qua con trỏ và muốn thay đổi giá trị.

#include <stdio.h> 

void func(int **ptr); 

int main() { 
    int array[2][2] = { 
     {2, 5}, {3, 6} 
    }; 

    func(array); 

    printf("%d", array[0][0]); 
    getch(); 
} 

void func(int **ptr) { 
    int i, j; 
    for (i = 0; i < 2; i++) { 
     for (j = 0; j < 2; j++) { 
      ptr[i][j] = 8; 
     } 
    } 
} 

Nhưng chương trình bị lỗi với điều này. Tôi đã làm gì sai?

+2

Sử dụng đúng chủng loại, 'trống func (int (* ptr) [2]) ', hoặc truyền một mảng con trỏ. –

+0

[Làm cách nào để sử dụng mảng trong C++?] (Http://stackoverflow.com/q/4810664/1202636) – effeffe

+0

Mảng không phải là con trỏ. Con trỏ không phải là mảng. Những gì bạn đã làm sai là không lặp đi lặp lại điều này cho chính mình cho đến khi bạn ngừng nghi ngờ nó. –

Trả lời

3

Nó đổ vỡ vì mảng không phải là con trỏ tới con trỏ, nó sẽ thử đọc các giá trị mảng như thể chúng là con trỏ, nhưng mảng chỉ chứa dữ liệu mà không có bất kỳ con trỏ nào.
Một mảng là tất cả liền kề trong bộ nhớ, chỉ cần chấp nhận một con trỏ duy nhất và làm một diễn viên khi gọi hàm:

func((int*)array); 

...

void func(int *ptr) { 
    int i, j; 
    for (i = 0; i < 2; i++) { 
     for (j = 0; j < 2; j++) { 
      ptr[i+j*2]=8; 
     } 
    } 
} 
+0

Cảm ơn. Bạn đã làm cho ngày của tôi. Nhưng làm thế nào để thiết lập i và j nếu tôi muốn lưu trữ những thứ khác nhau trong một mảng ?? –

+0

Tôi chưa hiểu ý bạn là gì. –

9

Mảng của bạn thuộc loại int[2][2] ("mảng 2 mảng 2 int") và tên của nó sẽ phân rã thành con trỏ thành phần tử đầu tiên có loại int(*)[2] ("con trỏ tới mảng 2 int"). Vì vậy, func nhu cầu của bạn để có một cuộc tranh cãi kiểu này:

void func(int (*ptr)[2]); 
// equivalently: 
// void func(int ptr[][2]); 

Ngoài ra, bạn có thể mất một tham chiếu đến kiểu mảng ("tham chiếu đến mảng của 2 mảng 2 int"):

void func(int (&ptr)[2][2]); 

Đảm bảo bạn thay đổi cả khai báo và định nghĩa.