指针数组和数组指针与二维数组

指针数组:
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);
 }

 

 

 

 
posted @ 2024-04-13 23:55  lethe1203  阅读(7)  评论(0编辑  收藏  举报