二维数组与指针

  • 数组的指针使用
  • 指针对数组的使用
  • 指针数组
  • 字符串指针

1.数组的指针使用

1.1测试代码
// 二维数组的指针使用
#include <stdio.h>
int main(int argc, char *argv[]) {
    // 一维指针概念
    int b[] = {1,2,3,4};
    printf("%p\n",&b); // &b是整个数组b的地址
    printf("%p\n",b);  // b是b[0]的地址
    printf("%p\n",&b[1]); 
    printf("%p\n",b+1); // b[0]+1 的地址
    printf("%p\n",&b[0]+1); // 同上
    printf("=================\n");
    //======================================================================
    int a[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    printf("%d\n", a[0][0]); //二维数组中元素a[0][0]的值
    printf("%p\n", &a[0][0]); //二维数组中元素a[0][0]的值对应的地址
    printf("%p\n", a[0]); //二维数组中a[0][0]的地址
    printf("%p\n", a); //二维数组中a[0]的地址
    printf("%p\n", &a); //二维数组a的地址
    printf("%p\n",a[1]); //二维数组中a[1][0]的地址
    printf("%d\n",*a[1]);//二维数组中a[1][0]的值
    // 验证 : 获取 a[2][3]的值 12
    printf("%p\n",a[2]+2);
    printf("%d\n",*(a[2]+2));

}
1.2输出结果(内存地址16进制)
0000001a431ffb20
0000001a431ffb20
0000001a431ffb24
0000001a431ffb24
0000001a431ffb24
=================
1
0000001a431ffaf0
0000001a431ffaf0
0000001a431ffaf0
0000001a431ffaf0
0000001a431ffb00
5
0000001a431ffb18
11
1.3画图逻辑解析

2.指针的二维数组的使用

//  指针的二维数组的使用
#include <stdio.h>

int main(int argc, char *argv[]) {
    int a[4][3] = {
        {10, 20, 30},
        {40, 50, 60},
        {70, 80, 90},
        {100, 110, 120}
    };
    int *p = a[0];
    // 获取到a[2][2]的地址和值   相当于指针往后推了多少个int字节 
    printf("%p\n",p+2*3+2);
    printf("%d\n",*(p+2*3+2));
}

指针变量和数组的指针不是同一个概念,指针变量指向了a[0]后只操作指向的内存地址。

操控二维数组直接暴力往后推多少个指针的数据类型的字节

3.指针数组

本质上还是都是一维数组,一维数组中一个元素存放一个一维数组

声明 : 数据类型 指针变量名[];

#include <stdio.h>

int main() {
    int line1[] = {1, 2, 3, 4};         //声明数组,矩阵的第一行
    int line2[] = {5, 6, 7, 8};         //声明数组,矩阵的第二行
    int line3[] = {9, 10, 11, 12};         //声明数组,矩阵的第三行
    int *p_line[3];              //声明整型指针数组
    p_line[0] = line1;           //初始化指针数组元素
    p_line[1] = line2;
    p_line[2] = line3;
    printf("矩阵:\n");
    for (int i = 0; i < 3; i++) {      //对指针数组元素循环
        for (int j = 0; j < 4; j++) {    //对矩阵每一列循环
            printf("%d\t", p_line[i][j]);
            //或改为printf("%d\t", *(p_line[i] + j));
        }
        printf("\n");
    }
    return 0;
}

4.字符串指针

#include <stdio.h>

int main(int argc, char *argv[]) {
    char *color[] = {
        "red",
        "blue",
        "green"
    };
    // color[0] 的地址
    char **p = color;
    printf("%p\n%s\n", color + 1, *(color + 1));
    printf("%p\n%s\n", &color[1], color[1]);
    printf("%p\n%s\n", p, *p);
    printf("%p\n%s\n", p+1, *(p+1));
    // &p == &color[0] = color
    // &p[1] == &color[1] = color[1]
    printf("%p\n%s\n", &p[1], p[1]);
    return 0;
}
000000a7bdfffab8
blue
000000a7bdfffab8
blue
000000a7bdfffab0
red
000000a7bdfffab8
blue
000000a7bdfffab8
blue
2026/01/23 完成c语言的学习,不知后续还会使用到吗,指针蛮好玩的。完结。