-
什么是指针?
指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。
指针一种特殊的数据类型,使用指针可以定义变量,这个变量就叫做指针变量
指针变量中存储的是整型数据,代表了内存编号,通过这个编号可以访问对应的内存
2.为什么要使用指针
1、函数之间相互独立,但有时是需要共享变量
传参是单向传递
全局变量容易命名冲突
使用数组还需要额外传长度
命名空间是独立的,但是地址空间是同一个
以上几点都是我们需要使用指针的情况
2、由于函数之间传参是值传递(内存拷贝),对于字节数较多的变量,值传递效率较低,如果传递的是变量的地址,只需要传递4/8个字节,可以提高传参效率
3、堆内存无法取名,他不像 data,bss,stack 内存段可以让变量名与内存之间建立联系,只能使用指针记录堆内存得到地址,以此来使用堆内存
3.如何的使用指针
先来看看指针的定义:
定义: 类型* 变量名_p;
1、指针变量与普通变量是有很大区别的,建议在取名时以p结尾加以区分
2、指针类型表示存储的是什么类型数据的地址,他决定了通过这个指针变量可以访问的字节数
3、一个 * 只能定义一个指针变量
int* p1,p2,p3; //此时只有p1是指针变量,p2,p3是int类型
int *p1,*p2,*p3; //p1,p2,p3都是指针变量
4、指针变量与普通变量一样的是默认值是随机的,一般都要初始化为 NULL
赋值 变量名_p = 地址; //必须是有权限并有意义的地址
通过赋值指向栈内存:
int* p = #
通过赋值指向堆内存:
int* p = malloc(4);
解引用: *变量名_p;
通过指针变量中记录的内存编号去访问内存,该过程可能产生段错误,根源是由于赋值时存储了一个非法的内存编号
*p <==> num
注意:解引用是访问的字节数取决于定义指针变量时的类型
空指针:值为NULL的指针变量叫做空指针,如果进行解引用就会产生段错误
NULL 会作为错误标志的一种表示执行错误,当一个函数的返回值是指针类型时,函数如果执行出错返回值就是 NULL