C杂讲 指针变量

目录

知识点1【指针变量的初始化】

 知识点2【&取地址符 和 *指针解引用符 区别】

知识点3【指针的注意事项】(重要)

1、void 不能定义变量

2、void *可以定义变量

3、不要对 没有初始化的 指针变量 取*

4、不要对 初始化为NULL的指针变量 取*

5、不要给 指针变量 赋普通的数值。

6、指针变量不要操作越界的空间。

知识点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);//操作非法空间

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值