- 课程名称:嵌入式工程师
- 学习章节:一级指针和一维数组
- 学习链接:https://class.imooc.com/sc/148/learn
- 讲师姓名:大白老师
课程内容:
一级指针和一维数组
数组
int a[5];
(1)数组名代表数组首元素的地址.
a <=>&a[0]<=>)0xdff30
指针保存数组
int a[5];
数组共有5个元素,分别是a[0]~a[4];
a[0] <====>int
&a[0]<====>int *
=====================================
int a[5];
int *p = &a[0];
而a和&a[0]是等价的,故我们也可以如下写法.
int *p = a;
一级指针遍历一维数组
int buf[5] = {10,20,30,40,50};
int *p = &buf[0]; //int *p = buf;
buf[0]<===>int
buf<=>&buf[0]<=>int ; 结论: buf[i]<===>(buf + i)<=>*(p + i)<=>p[i]
一级指针和一维数组的区别
(1)一级指针主要保存地址,占4bytes,而数组有多个
内存空间用来存放不同的数据,空间较大。
p的类型 int *
a的类型 int [5]
(2)数组名是一个地址常量,表示数组首元素的地址,常量不能更改.
int a[5] = {10,20,30,40,50};
int *p = a;
p++;//true;
a++; //error, a为地址常量,是数组第一个元素的地址,系统自动分配。
// 由于是一个常量,用户不能更改.
结论:数组赋值给指针,数组是常量不能更改,指针是变量可以更改
数组a指针p,可以p++不可以a++
关系与结论
a ,&a[0] 和 &a 之间的关系
a<===>&a[0], a[0]是int类型,占一个小int单元的带下,占4bytes.
&a中,代表了int [5]整个大单元的大小。
a+1 ,偏移4bytes大小
&a + 1,偏移20bytes大小
结论
int a[5];
总结:
a <===>&a[0]
a + 1
&a[0] + 1
&a + 1
a[0]为int类型,故&a[0] + 1一次偏移一个int类型的大小,4 bytes.
a为int [5]类型,故&a + 1 一次偏移一个int [5]类型的大小,20 bytes.
笔试题:
char a[5] = {10,20,31,32,40};
*(((char *)(&a + 1)) - 3) - 2 ====>输出多少? //29
学习收获:
通过本章学习了解到了 指针首地址的保存形式,数组和指针直接的对等关系
还有a和&a单元的大小
截图打卡:
共同学习,写下你的评论
评论加载中...
作者其他优质文章