2013-05-23 35 views
26

tôi đang học C và đang gặp khó khăn đi qua các con trỏ của một mảng 2D sang chức năng khác mà sau đó in các mảng 2D. Bất kỳ trợ giúp sẽ được đánh giá cao.Làm thế nào để vượt qua một mảng 2D bằng con trỏ trong C?

int main(void){ 
    char array[50][50]; 
    int SIZE; 

    ...call function to fill array... this part works. 

    printarray(array, SIZE); 
} 

void printarray(char **array, int SIZE){ 
    int i; 
    int j; 

    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", array[j][i]); 
     } 
     printf("\n"); 
    } 
} 
+1

trống printarray (mảng char [] [50], int SIZE) – Lucas

+1

Mặc dù có thể làm điều này, bạn nên chuyển đổi nó vào một mảng 1D và sử dụng 'j * SIZE + i' để lập chỉ mục nó. – Dave

+0

@Lưu tại sao? ............................... (chỉ cần điền) – kotlomoy

Trả lời

22

char ** không đại diện cho mảng 2D - nó sẽ là một chuỗi con trỏ đến con trỏ. Bạn cần thay đổi định nghĩa của printarray nếu bạn muốn vượt qua nó một mảng 2D:

void printarray(char (*array)[50], int SIZE) 

hoặc tương đương:

void printarray(char array[][50], int SIZE) 
+0

bạn có thể giải thích những gì cú pháp "char * array [50]" có nghĩa là ở đồng bằng tiếng anh? – user1362058

+3

@ user1362058: mảng 50 con trỏ đến char. www.cdecl.org –

+2

Chạy 'cdecl giải thích 'char (* arr) [50]'' sản lượng 'khai báo arr là con trỏ tới mảng 50 của char'. –

4

Trong main(), những "mảng" biến được khai báo là

char array[50][50]; 

Đây là một mảnh 2500 byte dữ liệu. Khi chính ('mảng') 's được truyền về, nó là một con trỏ đến đầu của dữ liệu đó. Nó là một con trỏ đến một char dự kiến ​​sẽ được tổ chức tại dãy 50.

Tuy nhiên, chức năng printarray(), bạn khai báo

char **array 

"mảng" ở đây là một con trỏ đến một "char * con trỏ" .

@Lucus gợi ý của "void printarray (char array [] [50], int SIZE)" công trình, ngoại trừ việc nó không phải là chung chung trong đó tham số SIZE bạn phải được 50.

Idea: đánh bại (yeech) loại mảng tham số trong printarray()

void printarray(void *array, int SIZE){ 
    int i; 
    int j; 
    char *charArray = (char *) array; 

    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", charArray[j*SIZE + i]); 
     } 
     printf("\n"); 
    } 
} 

Một giải pháp thanh lịch hơn là làm cho mảng "" thành một mảng con trỏ chính.

// Your original printarray() 
void printarray(char **array, int SIZE){ 
    int i; 
    int j; 
    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", array[j][i]); 
     } 
     printf("\n"); 
    } 
} 

// main() 
char **array; 
int SIZE; 
// Initialization of SIZE is not shown, but let's assume SIZE = 50; 
// Allocate table 
array = (char **) malloc(SIZE * sizeof(char*)); 
    // Note: alternative syntax 
    // array = (char **) malloc(SIZE * sizeof(*array)); 
// Allocate rows 
for (int row = 0; row<SIZE; row++) { 
    // Note: sizeof(char) is 1. (@Carl Norum) 
    // Shown here to help show difference between this malloc() and the above one. 
    array[row] = (char *) malloc(SIZE * sizeof(char)); 
    // Note: alternative syntax 
    // array[row] = (char *) malloc(SIZE * sizeof(**array)); 
    } 
// Initialize each element. 
for (int row = 0; row<SIZE; row++) { 
    for (int col = 0; col<SIZE; col++) { 
    array[row][col] = 'a'; // or whatever value you want 
    } 
} 
// Print it 
printarray(array, SIZE); 
... 
+0

'sizeof (char)' là '1'. –

+3

@CarlNorum Chỉ vì nó không có nghĩa là bạn phải thay thế nó tàn nhẫn bằng 1 (hoặc xóa hoàn toàn). Các câu lệnh 'sizeof' có thể đi một chặng đường dài để làm cho mã của bạn tự tạo tài liệu. – Thomas

+0

@Thomas - merci. – chux

0

Kể từ C99 hỗ trợ mảng động có kích thước, phong cách đơn giản sau đây thuận tiện hơn là phải vượt qua một mảng 2-dim:

void printarray(void *array0, int SIZE){ 
    char (*array)[SIZE] = array0; 
    int i; 
    int j; 
    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", array[j][i]); 
     } 
     printf("\n"); 
    } 
} 
0

Bạn có thể dễ dàng vượt qua các mảng 2ngày sử dụng con trỏ kép.

void printarray(char **array, int n) 
    { 
    int i, j; 
    for(i=0; i<n; i++) 
    { 
     for(j=0; j<n; j++) 
     { 
      printf("%c ", array[i][j]); 
     } 
     printf("\n"); 
    } 
    } 

    int main() 
    { 
     int n = 2; 
     int i, j; 

     char **array = (char **) malloc(n * sizeof(char*)); 

     for (i=0; i<n; i++) 
     { 
     array[i] = (char *) malloc(n* sizeof(char)); 
     } 

    for (i=0; i<n; i++) 
    { 
     for (j=0; j<n; j++) 
     { 
      scanf("%c ", &array[i][j]); 
     } 
    } 

    printarray(array, n); 

    return 0; 
    } 

Full Code: Ideone

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