【基础C语言】指针相关整理

指针相关整理

什么是指针

指针是一种数据类型(代表内存地址的整数),使用它定义的变量叫作指针变量。

为什么使用指针(什么情况下该用指针)

  1. 函数之间无法通过传参共享变量。
    函数的形参变量属于被调用者,实参属于调用者,函数之间的名字空间相互独立,是可以重名的,函数之间调用的数据传递都是值传递(赋值、内存拷贝)。
  2. 使用指针可以优化传参的效率。
  3. 堆内存无法与标识符建立联系,只能与指针配合使用。

如何使用指针

定义: 类型* 变量名p:

  1. 指针变量与普通变量使用方法有很大差别,一般以p结尾,与普通变量区分开。
  2. 星号表示此变量是指针变量。一个* 只能定义出一个指针变量,不能连续定义。
 int* p1,p2,p3; //p1是指针,p2,p3是int变量;
 int *p1,*p2,*p3; //三个指针变量
  1. 类型表示的是存储是什么变量。它决定了当通过地址访问这块内存时访问的字节数。

  2. 指针变量的默认值也是不确定的,一般初始化为NULL(空指针)。

    赋值:指针变量 = 地址。
    栈地址赋值:
    int num=0;
    int* p=NULL;
    p=#
    堆地址赋值:
    int* p=malloc(4)
    解引用(根据地址访问内存):*指针变量名 <=> 变量
    1. 根据变量中存储的内存编号去访问内存中的数据,访问多少个字节要根据指针变量的类型。
    2. 如果指针变量中存储的地址出错,此时可能发生段错误(这是赋值产生的错误)。

使用指针注意事项

空指针

指针变量的值为NULL(大多数是0,也有特殊情况是1),这种指针变量叫空指针,空指针不能进行解引用(即* 指针变量),NULL被操作系统当做复位地址了(存储了系统重启缩需要的数据),当操作系统察觉到程序访问NULL位置的数时就会向程序发送段错误的信号,程序就会死亡。
ATTENTION:空指针还被当作错误标志,如果一个函数的返回值是指针类型,实际返回的值是NULL,则说明函数执行失败或出错。

在c语言代码中应该杜绝空指针进行解引用,当使用来历不明的指针(调用者提供的)前,应该先判断是否为NULL。
#define NULL ((void*)0)
if(NULL == p)
{
}

野指针

指针变量的值是不确定的或者是无效的,这种指针叫做野指针。
使用野指针不一定会出问题,可能产生的后果如下:
1、一切正常
2、段错误
3、脏数据

ATTENTION :虽然野指针不一定会出错,但野指针比空指针危险更大,因为野指针是无法被判断出来的、也无法测试出来,也就意味着一旦出错无法杜绝。
虽然野指针无法测试也无法判断出来,但是所有野指针都是人为制造出来的,最好的方法就是不生产野指针
1、定义指针变量时要初始化。
2、不返回局部变量的地址。
3、资源释放后,指向它的指针及时置空。

指针的运算

指针的本质就是一个整数,因此从语法来说,整数能使用的运算符指针都能使用。
不是所有的运算符对指针变量都是有意义的。

    指针+整数    <=>    指针+宽度*整数    向右移动
    指针-整数    <=>    指针-宽度*整数    向左移动
    指针-指针    <=>    指针-指针/宽度    计算出两个两个指针之间相隔多少个元素

指针与数组(数组名是数组的首地址)

数组名就是指针(常指针),数组名与数组首地址是映射关系,而指针是指向关系。

由于数组名就是指针,所以数组名可以使用指针的解引用运算符,而指针也可以使用数组的[ ]运算符。

使用数组当函数的参数时:

数组会蜕变成指针,意味着数组的长度就丢失了,因此需要额外添加一个参数用来传递数组的长度。

指针与const

const int* p; 保护指针指向的数据,不能通过指针解引用修改内存的值。
int const *p; 同上。
int * const p; 保护指针变量,指针变量被初始化之后不能再显式修改赋值。
const int *const p; 既不能通过指针解引用修改内存的值,也不能初始化之后不能再显式修改赋值。
int const * const p; 同上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章