C语言中的指针-指针部分总结-学习笔记-43

总结

指针的概念比较多,抽象并且复杂,我们再把这一部分的内容回顾一下。

指针的含义

记住一句话,指针就是地址
凡事指针出现的地方,都是用地址代替的。
变量的指针:变量的地址
指针变量:地址变量

常见变量

1
2
3
4
5
6
7
8
9
10
int a;  //定义整型变量 a
int *p; //定义指针变量 p
int a[5]; //定义数组长度为5的整型数组 a
int *p[4]; //定义指针数组,数组存储的是4个地址,地址指向整型数据
int (*p)[4]; //定义了一个指向一维数组的指针,这个一维数组包含4个元素。
int f(); //定义了一个整型函数 f,没有参数。
int *p(); //定义了一个返回值为指针的函数 p,指针指向整型。
int (*p)(); //定义了一个指向函数的指针 p,该函数返回值为整型
int **p; //定义了一个指向指针的指针,指针指向的是整型。
void *p; //定义了一个不指向任何对象的指针变量 p。

区别指针和指针变量

指针就是地址本身,我们把地址称为指针。
指针变量,是存储着地址的一种指针变量,指针变量的值是地址

什么叫做指向

地址就意味着指向。
通过地址我们就能找到该地址对应的对象。
指针变量,存放地址,指针变量存放谁的地址,就指向谁。
(主要一匹配指针变量基类型和地址对象类型)

void * 是一种特殊的指针类型,它不指向任何数据,如果需要让它指向数据,需要先对其进行基类型转换。

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main(){
int a=20; //整型变量a,值为20
int *p1=&a,*p2; //整型指针变量p1指向a
void *pp; //不指向任何数据的指针 pp
pp=(void *)p1; //把 p1 的地址转换成 void 类型 ,赋值给 pp
p2=(int *)pp; //如果需要使用 void 类型 pp 地址的值,先转换成 int * 型
printf("%d\n",*p2); //在调用即可。
}

数组与指针

指针指向一维数组,一定是指向的该数组的首元素地址。

1
2
3
int a[20];
int *p;
p=a; //p 存储的是 a 的首元素地址,不是 a 这个数组

指针运算

指针变量加减一个整数

1
2
3
4
5
6
P++;
p--;
P+i;
P-i;
P+=i;
P-=i;

用于移动指针,加减的是指向变量所占用存储单元字节数相加减。

指针变量赋值

将一个变量地址赋值给一个指针变量。

1
2
3
4
5
p=&a;  //将变量 a 的地址赋值给指针变量 p
p=array; //将数组 array 的首元素地址赋值给指针变量 p
p=&array[2]; //将 array 的第二个数组元素地址赋值给指针变量 p
p=max; //将 max 函数的入口地址赋值给 p
p1 = p2: //p1 和 p2是基类型相同指针变量,将 p2 的值赋给 p1

两个指针变量可以相减

两个指针变量指向同一数组元素,两个指针变量值之差就是元素个数。

两个指针变量比较

若两个指针指向同一数组元素,则可以进行比较,指向前面元素的指针变量小于只想后面元素的指针变量。

指针变量可以有空值

指针变量也可以为空,即该指针变量不指向任何变量。

1
p=NULL;

NULL 是一个符号常量,表示整数0,在 stdio.h 文件中对 NULL 进行了定义。

1
# define NULL 0

注意
指针 p 的值等于 NULL 和指针 p 没有赋值是两个概念。
p=NULL;还是有值的,值为 0
不给 p 赋值,p 的值则无法预料,可能指向一个事先未指定的单元。
切记,在引用指针变量之前,对它赋值。

小技巧

任何指针变量都可以与 NULL 做不相等比较

1
2
3
if(p==NULL){
...
}

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!