目录
知识点1【指针变量的初始化】
void test02()
{
int num = 10;
int data = 200;
//如果 局部 指针变量 不初始化 保存的是随机的地址编号(千万别取值)
int *p;
//不想让指针变量指向任何地方 应该初始化为NULL(千万别取值)
//#define NULL ((void *)0)
int *p1 = NULL;
//将指针变量初始化为合法的地址(可以取值)
//千万别看成 *p2 = & num;
//*修饰p2为指针变量,p2=& num;
int *p2 = #//第一步:int *p2; 第二步:p2=& num;
printf("%d\n", *p2);//num==10
//指针变量 p2本质 是一个变量 可以更改指向
p2 = &data;
printf("%d\n", *p2);//data==200
}
运行结果:
总结:指针变量的初始化
1、指针变量初始化为NULL
int *p = NULL;//不要对p进行*p操作 容易出段错误
2、指针变量初始化为 合法的空间
int num = 10;
int *p = #//第一步定义指针变量int *p; 第二步给指针变量赋值:p=&num
知识点2【&取地址符 和 *指针解引用符 区别】
void test03()
{
int num = 10;
int *p;
//num的类型是 int 类型
//&num的类型是 int * 类型
//如果对一个变量取地址 整个表达式的类型 就是变量的类型+*.
p=#
//p的类型是 int *类型
//*p的类型是 int 类型
//如果对指针变量取* 整个表达式的类型是 指针变量的类型-*.
//高级总结:如果&和*同时存在 可以相互抵消(从右-->左)。(重要)
//论证:*p ==num
//*p=*&num==num;
//&*&*&num == &num
printf("p=%p\n",p);
printf("&*&**&p=%p\n",&*&**&p);
}
int main(int argc,char *argv[])
{
test03();
return 0;
}
运行结果:
知识点3【指针的注意事项】(重要)
1、void 不能定义变量
void num;//错误的 系统不知道 num的大小
2、void *可以定义变量
void *p;//p的类型为void *, 而void *指针类型,32为平台4字节,系统知道给p开辟4字节
//p叫万能指针 p可以保存 任意一级指针
char ch;
p = &ch;//char *
int num;
p = #//int *
float f;
p = &f;//flaot *
对于p 不能直接使用*p操作。 必须实现对p进行强制类型转换
void test04()
{
int num = 10;
void *p;
p = #
//printf("*p = %d\n", *p);//err 因为p的指向类型为void 系统确定不了宽度
printf("*p = %d\n", *(int *)p);//ok p临时的指向类型为int 系统确定宽度4B
}
3、不要对 没有初始化的 指针变量 取*
int *p;
printf("*p=%d\n",*p);
//因为p没有初始化 内容随机 也就是p指向了一个未知空间 系统不允许用户 取值*p操作
4、不要对 初始化为NULL的指针变量 取*
//NULL 就是(void *)0 地址,也是内存的起始地址 受系统保护
int *p=NULL;
printf("*p = %d\n", *p);//也不能 *p
5、不要给 指针变量 赋普通的数值。
int *p = 1000;//此时的1000对于p来说 是地址编号 1000
//*p表示在地址编号为1000的位置 取值 ,而地址编号1000不是合法的空间 所以不能*p
printf("*p = %d\n", *p);//也不能 *p
6、指针变量不要操作越界的空间。
char num=10;
int *p = #
//num只占1B空间 而p的指向类型为int 所以*p取值宽度为4B,所以越界3B
printf("*p =%d\n",*p);//操作非法空间