指针就是地址。
地址:数据的位置。
指针是C语言提供的一种类型。
类型 *
类型: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位
&变量名 – 普通变量。
数组名 – 数组。
*((int *)0x8000 0000) = 100;
//但是操作系统显示段错误,不允许普通用户直接修改地址的空间,基层嵌入式可以
类型 *标识符; – 没有赋初值,称为野指针变量。
类型 *标识符 = NULL; (习惯)
类型 *标识符 = &变量名;(习惯)
int num = 100;
定义1个指针变量指向该num空间?
int *pnum = #
pnum 代表的是本身变量的空间
*pnum 代表的是指向的空间
例如:int num = 0; char ch = 0; char str[1024]=”\0”;
int *pnum = NULL;//NULL – 空 = 0
指针变量在不使用的情况下,一般初始化为NULL,否则我们称该指针为野指针。
//int num1=100,num2=500;
//int pnum = NULL;
//pnum指向num1 – C语言如何编写? pnum = &num1; – 可以通过pnum 操作num1的空间。
//pnum指向num2 – C语言如何编写? pnum = &num2; – 可以通过*pnum操作num2的空间。
1.定义一个指针变量 int pnum = NULL;
2.把某个变量的地址赋值给指针变量 pnum = #
3.通过指针变量名,就可以操作某个变量空间 *pnum = 1000;
和普通变量一样。(指针类型) 某个变量地址。
unsigned int num = 0x12345678;
指针变量+1,物理地址+类型大小。
一样:num – 整型*
num[0] – 整型*
– 数组中第0个元素的空间 num[0]
*(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的内容,通过指针变量打印
原因:++和的优先级相同,从右到左执行。
先执行++,再执行p,地址+1(下面例子)
先执行*p,再++,内容+1
&num[0][0] – int * – 整型指针类型 – 第0行0列元素的地址 = int *
num – int (*)[4] – 整型数组指针类型
num[0] – int * – 整型指针类型 – 第0行的首地址 = int *
获取第1行的首地址:
&num[1][0]
也可以:num[1]
结果:num[0] num[1] num[2] – 代表了3个一维数组
数组指针 – 代表是指针 – 用于二维数组中。
指针数组 – 代表是数组 – 指针类型的数组
获取一个指针变量的地址?
&变量名;
定义1个指针变量,保存另外一个指针变量的地址。 — 二级指针
p – 本身变量空间
*p – 指向的空间
*(地址) – 对该地址进行寻址