课程章节:
- 课程名称:物联网/嵌入式工程师
- 章节名称:第2周之第二讲 1-1 至 1-4 C语言中的指针基础、C语言中的特殊指针
- 讲师姓名:大白老师
课程内容:
C语言中的指针基础
内存操作
write
data ------>ram
read
ram ------> data
C语言中分配内存的方法
通过变量名来分配
int a; //分配4byte的空间
C语言中对内存读写的方法
(1) 通过操作变量名来实现
int a;
a = 100; //写操作
printf("a = %d\n",a); //读操作
(2) 通过内存地址来进行读写操作
int a;
内存地址的获得方法: &a
规则:
* + 地址: 访问地址中的内存
*(&a) = 100 ;//写操作
printf("*(&a) = %d\n",*(&a)); //读操作
代码示例
#include <stdio.h>
int main()
{
int a = 80;
//写操作
*(&a) = 66;
//读操作
printf("*(&a) = %d\n",*(&a));
printf("a = %d\n",a); //66
return 0;
}
执行结果:
C语言中指针类型的设计的由来
常量 变量的类型
10 int
3.15 float
'A' char
0xdff88 ?
(内存地址)
思考:内存地址该用什么样的类型来保存呢?
答: 为了解决这样的问题,C语言的设计者创建了指针类型,来保存内存地址。
C语言的指针类型的定义方法
简介
数据类型 * 指针变量名;
例如:
char * p; //p的类型为char *
short *q; //q的类型为short *
int *m; //m的类型为int *
使用方法
int data = 10;
int * p = &data;
*p = 88;
printf("*p = %d\n",*p)
图解
代码示例
#include <stdio.h>
int main()
{
int data1 = 0,data2 = 0;
int * p = &data1; //p = &data1;
int * q = &data2; //q = &data2;
int sum = 0;
printf("please input two data : ");
scanf("%d%d",p,q);
printf("data1 = %d data2 = %d\n",data1,data2);
sum = *p + *q;
printf("data1 + data2 = %d\n",sum);
sum = *p - *q;
printf("data1 - data2 = %d\n",sum);
sum = data1 * data2;
printf("data1 * data2 = %d\n",sum);
sum = data1 / data2;
printf("data1 / data2 = %d\n",sum);
return 0;
}
执行结果:
课后练习
练习
int data1 = 10, data2 = 20;
int *p = NULL;
int *q = NULL;
//1.要求实现p和q分别保存data1和data2的地址.
//2.利用p和q交换data1和data2的值
//3.输出data1和data2的值
代码
#include <stdio.h>
int main()
{
int data1 = 10, data2 = 20;
int *p = NULL;
int *q = NULL;
p = &data1,q = &data2;
*p = *p ^ *q;
*q = *p ^ *q;
*p = *p ^ *q;
printf("data1 = %d data2 = %d\n",data1,data2);
return 0;
}
执行结果:
C语言中的特殊指针
野指针
野指针:野指针指的是指针中保存的是无效的内存地址。用户直接使用,系统会提示段错误.
例如:
int *p;
*p = 800;
Segmentation fault (core dumped) 段错误: 一般由用户访问了非法的内存所导致。
代码示例:
#include <stdio.h>
int main()
{
int *p;
*p = 800;
printf("*p = %d\n", *p);
return 0;
}
执行效果:
void * 指针
void * 是一种特殊的指针类型,可用于存放任意对象的地址。
例如:
int a = 10;
void *p = &a;
缺点: 由于不知道地址中存放的是何种类型的数据,因此不能直接操作void*指针所指的对象
代码示例
#include <stdio.h>
int main()
{
int data = 100;
void *p = &data;
printf("result = %d\n", *(int *)p);
return 0;
}
执行结果:
NULL指针
//例如: int a = 0;
#define NULL (void *)0
用户习惯: int *p = NULL;
含义: 定义指针的时候,一般会把指针的值初始化为0地址,仅仅用于初始化,
0地址我们用户一般,没有执行权限。直接对0地址操作操作,系统会提示段错误。
例如:
int *p = NULL;
*p = 800;
Segmentation fault (core dumped) 段错误: 一般由用户访问了非法的内存所导致。
代码示例
#include <stdio.h>
int main()
{
int data = 800;
int *p = NULL;
p = &data;
printf("result = %d\n", *p);
return 0;
}
执行结果:
学习笔记:
课后练习
练习
double f = 3.14;
//1.要求定义void *类型的指针保存f的地址.
//2.通过指针输出3.14的值
代码
#include <stdio.h>
int main()
{
double f = 3.14;
void *p = &f;
printf("result = %f\n", *(double *)p);
return 0;
}
执行结果:
课程评价:
通过这节课的学习,对地址有了更深入的了解,使用指针的方式有了基本的操作。