目录
知识点1【内存地址的概述】
系统给内存的每一个字节 分配一个编号 而这个编号 就是内存地址。
内存地址 也叫 指针。 指针 就是 地址 地址 就是 指针。
知识点2【指针变量概念】
指针变量:本质就是一个变量 只是这个变量 存放 是内存的地址编号(地址/指针)。
在32位平台 任何类型的地址编号 都是4字节。
知识点3【定义指针变量】(重要)
定义指针变量的步骤:
1、*修饰 指针变量名
2、保存啥类型变量的地址 就用该类型定义一个普通变量。
3、从上 往下 整体 替换
定义指针变量(前提)
1、明确保存 啥类型变量的地址。
案例:
void test02()
{
//num拥有一个合法的空间
int num = 10;
//需求:请定义一个指针变量 保存num的地址
//p就是指针变量 变量名为p 不是*p
//在定义的时候:*修饰p 表示p为指针变量
int *p;
//建立p和num的关系:p保存num的地址
printf("&num = %p\n",&num);
p = #//&num 代表的是num变量起始地址(首地址)
printf("p = %p\n", p);
}
运行结果:
知识点4【指针变量的使用】
通过p 对所保存的地址空间 进行读写操作(重要)
案例:
void test02()
{
//num拥有一个合法的空间
int num = 10;
//需求:请定义一个指针变量 保存num的地址
//p就是指针变量 变量名为p 不是*p
//在定义的时候:*修饰p 表示p为指针变量
int *p;
//建立p和num的关系:p保存num的地址
printf("&num = %p\n",&num);
p = #//&num 代表的是num变量起始地址(首地址)
printf("p = %p\n", p);
//*p 等价 num
printf("*p = %d\n", *p);//10==num
//*p = 100
*p = 100;//num = 100
printf("num = %d\n", num);
//scanf("%d", &num);
scanf("%d", p);//如果此处为 &p表示键盘给p赋值 而不是给num赋值
printf("num = %d\n",num);
}
运行结果:
知识点8【指针变量的类型】(重要)
int *p;
在定义中:
指针变量 自身类型。只将指针变量名拖黑 剩下啥类型 指针变量自身就是啥类型。
p自身的类型是int *。
指针变量 所指向的类型。将指针变量名和离它最近的一个*一起拖黑 剩下啥类型 就指向啥类型。
p指向的类型为int ==== p保存int类型变量的地址。
指向......类型 ==保存......类型变量的地址
int num = 10;
int *p;
p = &num //p 指向 num == p保存了num的地址
案例:指针变量取值宽度。(重要)
void test03()
{
int num = 0x01020304;
int *p;
short *p2;
char *p3;
p = #
p2 = #
p3 = #
printf("*p = %#x\n", *p);
printf("*p2 = %#x\n", *p2);
printf("*p3 = %#x\n", *p3);
}
案例:指针变量的跨度(重要)
void test04()
{
int num = 0x01020304;
int *p;
short *p2;
char *p3;
p = #
p2 = #
p3 = #
printf("p=%u\n",p);
printf("p+1=%u\n",p+1);
printf("-----------------\n");
printf("p2=%u\n",p2);
printf("p2+1=%u\n",p2+1);
printf("-----------------\n");
printf("p3=%u\n",p3);
printf("p3+1=%u\n",p3+1);
}
运行结果:
综合案例: