文章目录
- 一、指针
- 1.指针的意义
- 2.指针类型表示
- 3.一些操作
- 3.1打印1个变量地址
- 3.2通过地址查看改地址的内容以及修改改地址的内容
- 3.3操作某个空间 -- 4个字节,给他赋值为100,只知道该空间的地址0x8000 0000
- 4.指针变量的定义
- 5.指针类型的大小
- 6.指针变量的使用
- 6.1 指针变量的初始化
- 6.2一个指针变量对应多个普通变量
- 6.3想通过指针对某个变量空间操作:
- 6.4一个变量,多个指针指向该变量
- 6.5指针类型的强转
- 7.指针的其他应用
- 7.1 指针变量+1,物理地址变化
- 7.2指针与一维数组
- 7.2.1数组名代表该数组的首地址
- 7.2.2num和&num[0] -- 指针类型
- 7.2.3 *num -- 代表
- 7.2.4 *(p+1)和*p+1的区别
- 7.2.5 *p++和++*p的区别:
- 7.2.6扩展:数组名代表该数组的首地址,不能够进行变量++。
- 7.3数组名和指针名:指针名可以替换数组名
- 7.4指针与二维数组
- 7.4.1二维数组的首地址表示
- 7.4.2上述3种首地址表示方式他们的指针类型分别是:
- 7.4.3获取第一行首地址
- 7.4.4二维数组的数组名 -- 数组指针类型
- 7.5扩展
- 7.6指针的指针--二级指针
一、指针
指针就是地址。
1.指针的意义
地址:数据的位置。
指针是C语言提供的一种类型。
2.指针类型表示
类型 *
类型:char int float double 指针 结构体 数组
//char * – 代表这个地址里面存放的是char型数据 — 该指针指向一个char型空间
//int * – 代表这个地址里面存放的是int型数据
问题:
通过强制类型转换:(int *)0x40000000 – C语言代表1个可以存放整型数据的地址
*地址 – 代表该地址中的内容。
int num = 10;
打印num变量的地址:%p,&num
32位CPU和系统:地址 – 0x0000 0000 ~ 0xffff ffff – 32位
64位CPU和系统:地址 – 64位
3.一些操作
3.1打印1个变量地址
&变量名 – 普通变量。
数组名 – 数组。
3.2通过地址查看改地址的内容以及修改改地址的内容
操作空间如下图
3.3操作某个空间 – 4个字节,给他赋值为100,只知道该空间的地址0x8000 0000
*((int *)0x8000 0000) = 100;
//但是操作系统显示段错误,不允许普通用户直接修改地址的空间,基层嵌入式可以
4.指针变量的定义
类型 *标识符; – 没有赋初值,称为野指针变量。
类型 *标识符 = NULL; (习惯)
类型 *标识符 = &变量名;(习惯)
int num = 100;
定义1个指针变量指向该num空间?
int *pnum = #
pnum 代表的是本身变量的空间
*pnum 代表的是指向的空间
5.指针类型的大小
指针类型的大小–32位/64位
6.指针变量的使用
6.1 指针变量的初始化
例如:int num = 0; char ch = 0; char str[1024]=”\0”;
int *pnum = NULL;//NULL – 空 = 0
指针变量在不使用的情况下,一般初始化为NULL,否则我们称该指针为野指针。
6.2一个指针变量对应多个普通变量
//int num1=100,num2=500;
//int pnum = NULL;
//pnum指向num1 – C语言如何编写? pnum = &num1; – 可以通过pnum 操作num1的空间。
//pnum指向num2 – C语言如何编写? pnum = &num2; – 可以通过*pnum操作num2的空间。
6.3想通过指针对某个变量空间操作:
1.定义一个指针变量 int pnum = NULL;
2.把某个变量的地址赋值给指针变量 pnum = #
3.通过指针变量名,就可以操作某个变量空间 *pnum = 1000;
6.4一个变量,多个指针指向该变量
6.5指针类型的强转
和普通变量一样。(指针类型) 某个变量地址。
unsigned int num = 0x12345678;
7.指针的其他应用
7.1 指针变量+1,物理地址变化
指针变量+1,物理地址+类型大小。
7.2指针与一维数组
7.2.1数组名代表该数组的首地址
打印数组的首地址
在这里插入图片描述
7.2.2num和&num[0] – 指针类型
一样:num – 整型*
num[0] – 整型*
7.2.3 *num – 代表
– 数组中第0个元素的空间 num[0]
7.2.4 (p+1)和p+1的区别
*(p+1) 代表:地址+1 -- num[1]
p+1 = num[0]+1 = 11 – -因为优先级 > + 先执行*p,再执行+1
例1:
打印:int num[5]={10,8,6,4,2};num的内容,通过地址打印
例2:
打印:int num[5]={10,8,6,4,2};num的内容,通过指针变量打印
7.2.5 *p++和++*p的区别:
原因:++和的优先级相同,从右到左执行。
先执行++,再执行p,地址+1(下面例子)
先执行*p,再++,内容+1
7.2.6扩展:数组名代表该数组的首地址,不能够进行变量++。
7.3数组名和指针名:指针名可以替换数组名
7.4指针与二维数组
指针变量与二维数组的元素之间的关系:
7.4.1二维数组的首地址表示
7.4.2上述3种首地址表示方式他们的指针类型分别是:
&num[0][0] – int * – 整型指针类型 – 第0行0列元素的地址 = int *
num – int (*)[4] – 整型数组指针类型
num[0] – int * – 整型指针类型 – 第0行的首地址 = int *
7.4.3获取第一行首地址
获取第1行的首地址:
&num[1][0]
也可以:num[1]
结果:num[0] num[1] num[2] – 代表了3个一维数组
7.4.4二维数组的数组名 – 数组指针类型
7.5扩展
数组指针 – 代表是指针 – 用于二维数组中。
指针数组 – 代表是数组 – 指针类型的数组
7.6指针的指针–二级指针
获取一个指针变量的地址?
&变量名;
定义1个指针变量,保存另外一个指针变量的地址。 — 二级指针
p – 本身变量空间
*p – 指向的空间
*(地址) – 对该地址进行寻址