课程名称: 物联网/嵌入式工程师
课程章节: 第二周 计算机基础和C语言
主讲老师: 大白老师
今天的学习内容主要有:初识指针以及特殊指针。
指针定义:
比如int *p=NULL;
这里就是定义了一个名为p的整形指针,注意这里分开,定义是(int *)p。
指针是用来存放地址的,比如说
(&是取地址符号的意思)
int data1=10; int *p=&data1;
这是就是把data1的地址赋值给了p。
接下来介绍一下指针中常见的*
和上面的定义不同,要和int *这种区分开来。
*p,就是访问p所存的地址的意思,
星号后面要跟地址,所以也就相当于星号(&data1)。
常见的读写操作: *(&data1)=10; 相当于*p=10; //写操作 printf("%d",*p); //读操作
现在注意一点,不能存在野指针
什么是野指针
野指针:野指针指的是指针中保存的是无效的内存地址。用户直接使用,系统会提示段错误.(Segmentation fault (core dumped) 段错误: 一般由用户访问了非法的内存所导致。)
例如:
int *p; *p = 100; //error
这样是不对的,因为一开始定义了一个p指针,但是存放的地址并不清楚,而后只是对p进行的写操作,相当于*(&??),这样是不行的。
void* 指针 :
void * 是一种特殊的指针类型,可用于存放任意对象的地址。 例如: int a = 10; void *p = &a; 缺点: 由于不知道地址中存放的是何种类型的数据,因此不能直接操作void*指针所指的对象
这是由大白老师总结的,说的挺清楚。要想操作,就得强转,比如(int *)p
NULL指针:
通常用来初始化
#define NULL (void *)0
比如int *p=NULL;
0地址我们用户一般没有执行权限。直接对0地址操作操作,系统会提示段错误。
所以还是在初始化后赋值再进行操作
附上今天的课后作业:
答案:
1. int *p =&data1; int *q =&data2; 2 *p=data2; *q=data1; *p^=*q; *q^=*p; *p^=*q; 3. printf("%d,%d",*p,*q);
只有经历地狱般的磨练,才能练出创造天堂的力量;只有流过血的手指,才能弹出世间的绝唱。
——泰戈尔