指標陣列和陣列指標與二維陣列

lethe1203發表於2024-04-13
指標陣列:
int *p[2]; // p先與[]組合成為陣列,所以這個玩意是個陣列

陣列指標:
int (*p)[2]; // p先與*組合成為指標,所以這個玩意是個指標
符號優先順序:() > [] > *
指標陣列的demo:
#include <stdio.h>

int main() {
    // 宣告一個指標陣列,每個元素是指向整數的指標
    int *ptrArray[3];

    // 宣告一些整數變數
    int num1 = 10;
    int num2 = 20;
    int num3 = 30;

    // 將指標陣列的元素指向這些整數變數的地址
    ptrArray[0] = &num1;
    ptrArray[1] = &num2;
    ptrArray[2] = &num3;

    // 使用指標陣列訪問這些整數變數的值
    printf("Value of num1: %d\n", *ptrArray[0]); // 輸出:10
    printf("Value of num2: %d\n", *ptrArray[1]); // 輸出:20
    printf("Value of num3: %d\n", *ptrArray[2]); // 輸出:30

    return 0;
}
指標陣列和二維陣列的關係:
指標陣列指向一個二維陣列時,每個指標元素指向二維陣列的一行,如下示例:
 #include <stdio.h>
 #include <string.h>

 int main()
 {
         int *p[2];
         int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

         p[0] = a[0];
         p[1] = a[1];

         printf("p[0][0] = %d\n", p[0][0]);
         printf("p[0][2] = %d\n", p[0][2]);
         printf("p[1][2] = %d\n", *(p[1] + 2));    // 指標加法操作是按照指標的型別計算偏移量
 }
陣列指標和二維陣列的關係:
陣列名本身就是一個指向陣列首元素的指標。例如,array 是一個指向 array[0] 的指標。
 #include <stdio.h>
 #include <string.h>

 int main()
 {
         int (*p)[3];
         int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

         p = a;

         printf("p[1][2] = %d \n", p[1][2]);
         printf("p[1][2] = %d \n", *(*(a + 1) + 2));
         printf("p[1][2] = %d \n", *(*(p + 1) + 2));

         printf("(*p)[0] = %d \n", (*p)[0]);
         printf("(*p)[1] = %d \n", (*p)[1]);
 }
三種方式實現二位陣列求得所有元素的和:
用二維陣列的方式:
 #include <stdio.h>
 #include <string.h>

 int add(int a[][3], int x, int y)
 {
         int num = 0;
         for (int i = 0; i < x; i++)
                 for (int j = 0; j < y; j++)
                         num += a[i][j];

         return num;
 }

 int main()
 {
         int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
         int num = 0;

         num = add(a, 2, 3);

         printf("num = %d \n", num);
 }
用指標陣列的方式:
 #include <stdio.h>
 #include <string.h>

 int add(int *b[2], int x, int y)
 {
         int num = 0;
         for (int i = 0; i < x; i++)
                 for (int j = 0; j < y; j++)
                         num += b[i][j];

         return num;
 }

 int main()
 {
         int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
         int num = 0;
         int *b[2];

         b[0] = a[0];
         b[1] = a[1];

         num = add(b, 2, 3);

         printf("num = %d \n", num);
 }
用陣列指標的方式:
 #include <stdio.h>
 #include <string.h>

 int add(int (*b)[3], int x, int y)
 {
         int num = 0;
         for (int i = 0; i < x; i++)
                 for (int j = 0; j < y; j++)
                         num += *(*(b + i) +j);

         return num;
 }

 int main()
 {
         int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
         int num = 0;
         int (*b)[3];

         b = a;

         num = add(b, 2, 3);

         printf("num = %d \n", num);
 }

相關文章