3.1、指针到底是什么?
3.1.1、指针变量和普通变量的区别
(1) 首先必须非常明确:指针的实质就是个变量,它跟普通变量没有任何本质区别(把指针当普通变量来理解)。
(2) 指针完整的名字应该叫指针变量,简称指针。
3.1.2、为什么需要指针?
(1) 指针的出现是为了实现间接访问,在汇编中都有间接访问,其实就是CPU的寻址方式中的间接寻址。
(2) 间接访问(CPU的间接寻址)是CPU设计时决定的,这个决定了汇编语言必须能够实现间接寻址,又决定了汇编之上的C语言也必须实现间接寻址。
(3) 高级语言如Java、C#等没有指针,那么他们怎么实现间接访问呢?答案是语言本身帮我们封装了。
3.1.3、指针使用三部曲
定义指针变量、关联指针变量、解引用
(1) 当我们int *p定义一个指针变量p时,因为p是局部变量,所以也遵循C语言局部变量的一般规律(定义局部变量并且未初始化,则值是随机的),所以此时p变量中存储的是一个随机的数字。
(2) 此时如果我们解引用p,则相当于我们访问了这个随机数字为地址的内存空间,那这个空间到底能不能访问不知道(也许行也许不行),所以如果直接定义指针变量未绑定有效地址就去解引用几乎必死无疑。
(3) 定义一个指针变量,不经过绑定有效地址就去解引用,就好像哪一个上了膛的枪随意转了几圈,然后开了一枪。
(4) 指针绑定的意义就在于:让指针指向一个可以访问、应该访问的地方(就好像拿着枪瞄准目标的过程一样),指针的解引用是为了间接访问目标变量(就好像开枪是为了打中目标一样)
#include<stdio.h>
int main(void)
{
int a = 23;
//演示指针的标准使用方式
//指针使用分3步:定义指针变量、给指针变量赋值(绑定指针)、解引用(使用、赋值)
//1,定义指针变量
int *p;
printf("p = %p, Randomly address value\n", p);
// printf("p = 0x%x\n", p); //%p和%x打印指针,打印出来的值是一样的
//2,绑定指针,其实就是给指针变量赋值,也就是让指针指向另一个变量。当我们没有绑定指针变量之前,这个指针不能被解引用。
p = &a; //实现指针绑定,让p指向变量a
printf("p = %p\n", p);
//3,解引用,如果没有绑定指针到某个变量就去解引用,几乎一定会出错
*p = 555; //把555放入p指向的变量中
printf("a = %d\n", a);
printf("*p = %d\n", *p);
printf("p = %p\n", p);
return 0;
}
返回:C语言指针系列目录