二维数组与指针
数组的指针使用指针对数组的使用指针数组字符串指针
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
111.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
blue2026/01/23 完成c语言的学习,不知后续还会使用到吗,指针蛮好玩的。完结。