课程章节:
课程名称:物联网/嵌入式工程师
章节名称:第2周之第三讲 1-11 至 1-14 C语言中的指针:指针和二维数组、数组指针和二维数组
讲师姓名:大白老师
课程内容:
C语言中的指针:指针和二维数组
二维数组基本概念
数据类型 变量名[行数][列数];
例如:
int a[3][2];
特点:
(1)数组名 a
(2)数组元素:a[0][0],a[0][1] .... a[2][1]
(3)实际内存中的排列方式
-----------------------------
低地址
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
高地址
认为理解为:
a[0] a[0][0] a[0][1]
a a[1] a[1][0] a[1][1]
a[2] a[2][0] a[2][1]
=======================================================
指针数组和数组指针
指针数组是一个数组
数组指针是一个指针
指针数组
int a = 10,b = 20,c = 30;
int *p[3] = {&a,&b,&c};
数组指针
本质上是一个指针变量,这个变量可以用来记录一个数组类型的地址
int a[3]; => 去掉名字,剩下的是类型, int [3]
&a => 表示获取数组类型的地址,此时这个地址类型是 int (*)[3];
int a[3][2];
a表示的地址中存放了三个一维数组类型的数据,此时这个地址的类型是 int (*)[2]
a[0] a[0][0] a[0][1]
a a[1] a[1][0] a[1][1]
a[2] a[2][0] a[2][1]
a[0]:{a[0][0],a[0][1]} => int [2]
a[1]:{a[1][0],a[1][1]} => int [2]
a[2]:{a[2][0],a[2][1]} => int [2]
a <===> &a[0]
a[0] <===> int [2]
&a[0] <==> int (*p)[2]
a <===> &a[0] <===> int (*p)[2]
*a <==> *(&a[0]) ====> *a<===>a[0]
*a <===> a[0] <====> &a[0][0] <===> int *
a[0][0] <===> int
总结:
int a[3]; int b[3][2];
a : int * => a + 1 移动1个元素,4byte
&a : int (*)[3] => &a + 1 移动3个元素, 12byte
b : int (*)[2] => b + 1 移动2个元素,8byte
b[0]:int * => b[0]+1 移动1个元素,4byte
&b :int (*)[3][2]=>&b + 1 移动6个元素,24byte
定义方式
数据类型 (*变量名)[元素的个数];
例如:
int (*p)[3];
移动
int (*p)[3];
数组指针每次移动的是一个数组的大小
p ++;// p移动了3个元素,12byte
转换
数组类型指针---加*---->普通类型指针
int (*p)[3];
p的类型int ()[3]----------- 加 * ---------->*p的类型是int *
代码示例
#include <stdio.h>
int main()
{
int a[3];
int b[3][2];
printf("a = %#x\n",a); // int *
printf("&a = %#x\n",&a); // int (*)[3]
printf("b = %#x\n",b); // int (*)[2]
printf("b[0] = %#x\n",b[0]); // int *
printf("--------------------\n");
printf("a + 1 = %#x\n",a + 1); // int *
printf("&a + 1 = %#x\n",&a + 1); // int (*)[3]
printf("b + 1 = %#x\n",b + 1); // int (*)[2]
printf("b[0] + 1 = %#x\n",b[0] + 1); // int *
return 0;
}
C语言中的指针:数组指针和二维数组
数组指针保存二维数组
int a[3][4];
int (*p)[4];
p = a;
公式
a[i][j] <=> *(a[i] + j) <=>*(*(a + i) + j)
p[i][j] <=> *(p[i] + j) <=>*(*(p + i) + j)
注意:
a是一个数组名,它标识数组的首地址,它是一个符号常量,不能修改
p是一个指针变量,它保存了二维数组的首地址,它是一个变量,可以修改
- 思考?
int a[3][2]
, 想要或的数组中a[1][1]
值的方法有哪些?
a[0] a[0][0] a[0][1]
a a[1] a[1][0] a[1][1]
a[2] a[2][0] a[2][1]
答案:
a[1][1] , *(a[1] + 1) , *(*(a + 1) + 1),
*(a[0] + 3)
代码示例
#include <stdio.h>
#define M 2
#define N 3
int main()
{
// int a[2][3];
int a[M][N] = {10,20,30,40,50,60};
int (*p)[N] = a; // p = a;
// a[1][1] = 50
printf("a[1][1] = %d\n",a[1][1]);
printf("*(a[1] + 1) = %d\n",*(a[1] + 1));
printf("*(*(a + 1) + 1) = %d\n",*(*(a + 1) + 1));
printf("=======================================\n");
printf("*(*(p + 1) + 1) = %d\n",*(*(p + 1) + 1));
printf("*(p[1] + 1) = %d\n",*(p[1] + 1));
printf("p[1][1] = %d\n",p[1][1]);
return 0;
}
课后任务
练习
int a[2][3] = {10,20,30,40,50,60};
int (*p)[3] = a;
要求通过多种方式输出a数组中的数据
代码示例
#include <stdio.h>
int main()
{
return 0;
}
学习笔记:
练习
char a1[] = "abcde";
char a2[] = "XYZBBQ";
char *p_array[] = {a1,a2,NULL};
1.要求把通过p_array把a1所有所有小写字符换成大写字符。
2.要求把通过p_array把a2所有所有大写字符换成小写字符。
3.输出a1和a2字符串的数据观察效果。
代码
#include <stdio.h>
int main()
{
char a1[] = "abcde";
char a2[] = "XYZBBQ";
char *p_array[] = {a1,a2,NULL};
char *t = NULL;
for (int i = 0; p_array[i] != NULL; ++i)
{
for (t = p_array[i]; *t != '\0'; ++t)
{
*t = *t >= 'A' && *t <= 'Z' ? *t + 32 : *t - 32;
}
printf("a%d[] = %s \n",i+1,p_array[i]);
}
return 0;
}
课程评价:
学懂了这两个概念很有收获,但是还要多练习和多看还没有熟练掌握。指针数组是一个数组
数组指针是一个指针