【嵌入式C语言】06.数组和指针的关系

发布时间:2026/7/5 13:34:08
【嵌入式C语言】06.数组和指针的关系 一、一维数组和指针之间的关系1.两个重要的结论结论一数组名出现在表达式中代表该数组首元素的地址数组名相当于是个指针一个指向本数组首元素地址的指针结论二数组名前面,表示的是指向整个一维数组的一个指针(数组指针)2.一维数组和指针的关系2.1 访问数组的方法第一种数组名[下标]a[1];第二种: *(数组名1)*(a1);第三种引入单独的指针指向数组的首元素int pa; //a等价于a[0]p[0]; //等价于a[0]p[1]; //等价于a[1]*(p2); //等价于a[2]2.2 两个指针相减表示数组中两个指针之间间隔了多少个数据int a[10]{45,89,96,12};int *p1a;int *p2a[7];p2-p1结果是多少注意经典错误理解成直接用地址值做减法2.3 关于一维数组名的几种写法a int *类型的指针a 数组指针a[0] 非指针数组首元素值a[0] 数组首元素的地址a1 加类型的大小 4个字节a1 加的是整个数组的大小a[0]1 a[0]的值加1a[0]1 加类型的大小 4个字节二、数组指针和指针数组1.数组指针(中心词是指针)1.1 概念int *p; int类型指针char *p; char类型指针数组 *p数组类型指针 --》数组指针 --》指向某个数组的指针类型 (*指针名)[数组元素个数]1.2 如何定义数组指针int a[10];char b[15];int (*p)[10]a; //定义了 int[10]类型的数组指针指向数组achar (*q)[15]b; //定义了 char[15]类型的数组指针指向数组b2.指针数组(中心词是数组)2.1 概念数组中存放的全部都是指针这种数组就叫做指针数组类型 数组名[元素个数]情况1类型是指针 --》这种数组叫做指针数组int *buf[10];情况2类型非指针 --》这种数组就是我们前面学习过的普通类型的数组int buf[10];int a[10]; //10个intchar b[5]; //5个charint *c[3]; //3个int *char *d[4]; //4个char *2.2 如何定义指针数组指针类型 数组名[数组元素个数];三、二维数组和指针之间的关系1.两个重要的结论结论一二维数组名出现在表达式中代表该数组首元素的地址二维数组名相当于是个指针一个指向本数组首元素地址的指针把二维数组理解为特殊的一维数组比如char a[3][20]; //理解为包含了3个 char[20]的数组int b[7][15]; //理解为包含了7个 int[15]的数组结论二二维数组名前面,表示的是指向整个二维数组的一个指针(数组指针)2.二维数组和指针的关系2.1 访问数组的方法第一种数组名[下标][下标]a[i][j];第二种引入单独的指针指向数组的首元素2.2 两个指针相减表示数组中两个指针之间间隔了多少个数据注意经典错误理解成直接用地址值做减法2.3 关于有二维数组名的几种写法a 二维数组首元素的地址 --》 a[0]的地址,数组指针 int (*p)[10]a 数组指针 int (*p)[7][10]a[0] 第一个一维数组int[10]的名字表示该数组首元素a[0][0]的地址 int *a[0] 数组指针 int (*p)[10]a[0][0] 非指针a[0][0] int *a1 加类型的大小 int[10]大小a1 加的是整个数组的大小,int[7][10]大小a[0]1 4个字节a[0]1 加类型的大小 int[10]大小a[0][0]1 把数据加1a[0][0]1 4个字节指针的类型决定了加减1的步长我的理解练习题1.计算结果#includeint main(){int x[]{10,20,30};int *pxx;printf(%d,*px);printf(%d,*px);pxx;printf(%d,(*px));printf(%d,*px);pxx;printf(%d,*px);printf(%d,*px);pxx;printf(%d,*px);printf(%d,*px);return 0;}2.下面程序的输出是int main(){int a[5]{1,2,3,4,5};int *ptr(int *)(a1);printf(%d, %d\n,*(a1),*(ptr-1))}3.下面判断正确的是A. char *achina;等价于char *a; *achina;B. char str[10]{china};等价于char str[10]; str[]{china};C. char *schina;等价于char *s; schina;D. char c[4]abc,d[4]abc;等价于char c[4]d[4]abc;C自己A的类型不匹配B的数组名是常量地址不能修改赋值D的数组名是常量地址不能修改赋值4.#includevoid main( ){int a99;int b99;char s1[]Hello World!;char s2[]Hello World!;if(s1s2 )printf(“Equal!”);elseprintf(“Not equal!”);}Not equal!5.#includevoid main( ){char s[]Hello World!;char* p s;int n10;printf(%d %d %d %d\n,sizeof(s),sizeof(p),strlen(p),sizeof(n));}13 8 12 4注意打印类型sizeof和strlen否用%zu打印6.char buf[10]gecchina;char *pbuf[3];pp2;*p#;printf(buf is:%s\n,buf);printf(p is:%s\n,p);gecch#na#na7.char buf[5][10]{hello,world,china};char *pbuf[1][3];char *qbuf[2][1];printf(q-p is:%d\n,q-p);