C指针之指针到底是什么?

指针到底是什么?

  • 指针到底是什么?
    • 首先必须非常明确:指针的实质就是个变量,它跟普通变量没有任何本质区别
    • 指针完整的名字应该叫指针变量,简称为指针
    • 告诉编译器,这个变量用途或者说实质意义。
// a的实质其实就是一个编译器中的符号,在编译器中a和一个内存空间联系起来
// 这个内存空间就是a所代表的那个变量。
int a;			// 定义了int型变量,名字叫a
int *p;			// 定义了一个指针变量,名字叫p,p指向一个int型变量

a = 4;            // 可以操作
p = 4;            // 编译器不允许,因为指针变量虽然实质上也是普通变量,但是它的
                    // 用途和普通变量不同。指针变量存储的应该是另外一个变量的地址
                    // 而不是用来随意存一些int类型的数。
p = (int *)4;	// 我们明知道其实就是数字4,但是我强制类型转换成int *类型的4
					// 相当于我告诉编译器,这个4其实是个地址(而且是个int类型变量
					// 的地址),那么(int *)4就和p类型相匹配了,编译器就过了。

为什么需要指针?

  • (1)指针的出现是为了实现间接访问在汇编中都有间接访问,其实就是CPU的寻址方式中的间接寻址
  • (2)间接访问(CPU的间接寻址)是CPU设计时决定的,这个决定了汇编语言必须能够实现间接寻址,又决定了汇编之上的C语言也必须实现简介寻址。
  • (3)高级语言如Java、C#等没有指针,那他们怎么实现间接访问?答案是语言本身帮我们封装了。

指针使用三部曲:定义指针变量、关联指针变量、解引用

  • (1)当我们int *p定义一个指针变量p时,因为p是局部变量,所以也遵循C语言局部变量的一般规律(定义局部变量并且未初始化,则值是随机的),所以此时p变量中存储的是一个随机的数字。
  • (2)此时如果我们解引用p,则相当于我们访问了这个随机数字为地址的内存空间。那这个空间到底能不能访问不知道(也许行也许不行),所以如果直接定义指针变量未绑定有效地址就去解引用几乎必死无疑。
  • (3)定义一个指针变量,不经绑定有效地址就去解引用,就好象拿一个上了镗的枪随意转了几圈然后开了一枪。
  • (4)指针绑定的意义就在于:让指针指向一个可以访问、应该访问的地方(就好象拿着枪瞄准目标的过程一样),指针的解引用是为了间接访问目标变量(就好象开枪是为了打中目标一样)
    // 指针使用分3步:定义指针变量、给指针变量赋值(绑定指针)、解引用
	int a = 23;
	// 第一步,定义指针变量
	int *p;
	printf("p = %p.\n", p);		// %p打印指针和%x打印指针,打印出的值是一样的
	printf("p = 0x%x.\n", p);
	
	
	// 第二步,绑定指针,其实就是给指针变量赋值,也就是让这个指针指向另外一个变量
	// 当我们没有绑定指针变量之前,这个指针不能被解引用。
	p = &a;				// 实现指针绑定,让p指向变量a
	p = (int *)4;		// 实现指针绑定,让p指向内存地址为4的那个变量
	
	// 第三步,解引用。
	// 如果没有绑定指针到某个变量就去解引用,几乎一定会出错。
	*p = 555;			// 把555放入p指向的变量中

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值