簡體   English   中英

C:二維數組的指針

[英]C : Pointer for two dimension array

我可以將指針用於一維數組以實現功能,但是我不知道對二維數組使用相同的技術。

這是我的示例代碼:

     int main(){
          int b[10]; //initialize b
          Print(b);
          int a[10][10]; //initialize a
          Print2(a);
        }

        void Print(int*b){  
           for(int i=0; i<10; i++)
              printf("%d\n",*(b+i));
        }

    // I want to use same technique here
    // but i have met error 

        void Print2(int*a){
           for(int i=0; i<10; i++)
              for(int j=0; j<10; j++)
                  printf("%d\n",*(*(a+i)+j));  // error at this line
        }

請幫助我如何將一維數組的相同技術用於二維數組。

謝謝 :)

銷毀內部*並將i乘以10,然后加j

 printf("%d\n",*((a+i*10)+j));

因為要在2D矩陣中“向下”移動,所以您要經過維度1(在此示例中為10)元素。

3d:

 printf("%d\n",*(a+i*100+j*10+k));

對於N維:

  *(a+i*(size of i-dimension)+j*(size of j dim)+......+last index)

我發現此粘貼非常有用,稱為“數組衰減”。 檢查每個示例行上方的注釋的類型。

http://ideone.com/1PyNC

b是一個整數數組,因此它的第一個元素是一個int b衰減到指向其第一個元素的指針時,結果就是int* (這就是您的Print函數所接受的)。

a是一個數組數組,因此它的第一個元素是一個數組。 a衰變到一個指針到它的第一元件,其結果因此是一個指針到陣列的-10-整數:

void Print2(int (*a)[10] ){    // pointer-to-array type
    for(int i=0; i<10; i++)
        for(int j=0; j<10; j++)
            printf("%d\n",a[i][j]);
}

多維數組只能帶您進入C語言,因為當您將它們傳遞給周圍時,只有第一個維度是可變的。 其余尺寸在編譯時需要知道,因為它們是指針類型的一部分。 如果您需要在多個維度上可變的東西,則可以按照tuğrulbüyükışık的答案將其“展平”,並使用一維數組。

問題是,數組衰減到指針,但是二維數組衰減到指向特定大小的數組的指針。

#include "stdio.h"

void print(int *arr);
void print2D(int (*arr)[]);

int main() {
    int data[5] = {1, 2, 3, 4, 5};
    print(data);

    int data2D[5][5];
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            data2D[i][j] = (i + 1) * 10 + (j + 1);
        }
    }
    print2D(data2D);
}

void print(int *arr) {  
    for (int i = 0; i < 5; i++) {
        printf("%d\n", arr[i]);
    }
}

void print2D(int (*arr)[5]) {  
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            printf("%d\n", arr[i][j]);
        }
    }
}

如您所見,在這里,我將二維函數中的array聲明為指向5個元素的數組的指針。 現在,當我增加i ,編譯器知道我要跳過五個元素。 您可以在Ideone運行此示例

當然,您可以手動進行。 在這種情況下,您將必須自己計算地址。 在這種情況下,該函數將如下所示:

void print2D(int *arr) {  
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            printf("%d\n", *(arr + (i * 5) + j));
        }
    }
}

您將不得不這樣稱呼:

print2D(data2D[0]);

關於Ideone的第二個示例

        #include <stdio.h>

        void Print(int*b)
        {
        int i;
           for(i=0; i<10; i++)
              printf("%d\n",*(b+i));
        }


        void Print2(int*a)
        {
           int i,j;
           for( i=0; i<10; i++)
           {
              printf("\n");
              for(j=0; j<10; j++)
                  printf("%d\t",*(a+(i*10)+j));  // Modification done here.
           }
        }

        int main()
        {
          int b[10]; //initialize b
          Print(b);
          int a[10][10] = {}; //initialize a 0
          Print2((int*)a);
          return 0;
        }

我已經修改了Print2()。

將(一維數組的大小*要訪問的一維數組(i))+一維數組(j)中的特定元素添加到數組的基址中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM