文章目录
一提到C语言,很多人第一时间想到的就是指针。究其根本就是指针以复杂著称,本人也是学习完第一遍之后也是和大多数人一样云里雾里,做题时也是一窍不通,后来有又多刷了几遍然后就豁然开朗,做题正确率也是十分的高。所以说学习指针真正诀窍在于学他个三五遍
本人的指针讲解严格意义上来讲根本不算是讲解,只是我个人的一个笔记罢了。
因为指针这个东西偏概念性,所以文字不好叙述,我在这里只会讲指针的大概,主要意图是为了供自己复习使用。
想看指针详细讲解的同学,可以去看这篇大哥的讲解 CSDN大神指针详细讲解,本篇文章适合有基础的同学进行观看。
一、什么是指针?
指针通俗来讲就是地址,指针就是地址,地址就是指针
。我们定义了一个变量,系统对变量进行编译
的时候就会给这个变量分配内存单元,内存若是一个公寓,那么内存单元就是公寓的一间间屋子,而指针就是公寓的“ 门牌号 ”。
二、定义指针变量
指针变量 : 含义就是存放变量地址的变量,本质仍然是变量
指针变量格式:
数据类型 *指针变量名 //eg int *a; 比普通的变量定义 多一个*,这里的*就是表示该变量为指针变量
注:若数据类型为void类型则表示该指针变量为空类型
指针变脸所占的字节数:
TC系统 | VC系统 |
---|---|
2字节 | 4字节 |
注:指针变量所占字节数和数据类型无关
三、指针变量的赋值
前面我们提到过指针变量保存的是变量的地址而非变量的元素数值,所以我们要把元素的地址给提取出来然后才可以进行下一步的赋值操作,这时候取地址运算符就应该现身了 &。
取地址运算符 | & |
---|---|
优先级 | 整数第二 |
结合性 | 从右往左 |
作用 | 获取变量的地址 |
用法很简单就是把变量的地址利用取地址运算符获取到然后再赋值给指针变量就可以达到赋值的操作。
举个栗子
int a=6,*p=&a; //这时就把a的地址赋值给了指针变量p,指针变量p也就指向了元素a
注意!!!
1.&a赋值给的时指针变量p而不是* p, *只是起到定义作用
2.变量的数值类型要和指针的数值类型保持一致
3.若定义了一个指针变量等于NULL,则代表该指针为空指针,NULL的数值为0
4.上面例子的p = &a,输入数据时可等同使用
四、指针变量的引用
访问变量有直接访问
和间接访问
两种
指针运算符/简介访问运算符/取内容运算符 | * |
---|---|
优先级 | 正数第二 |
结合性 | 从右往左 |
作用 | 获取指针所指向对象的内容 |
这时候估计就会有很多同学就懵了,这个*一会代表定义指针变量,一会代表取内容运算符,到底算个神魔东西啊,不要慌请看下面表格便一目了然。
Please look at the table below
双目内为乘法 | a*b |
---|---|
前有数据类型,后为定义的为指针 | *p |
定义之外且为单目运算符 | 取内容运算符 |
举个栗子
int a=5;
int *p=&a;
peintf("%d\n",*p); //结果就为5,因为去内容运算符*就是取指针所指向的内容,指针指向a,a的内容为5,所以结果为5
二级指针:
格式:
int **q;
含义就是指向指针的指针,内部保存的就是指针的变量地址
int a=6;
int *q=&a;
int **p=&q;
printf("%d\n"**q); //**q可以看成*(p)就是取q指针所指向内容,此时q指向q
五、指针和一维数组
重点!!!
一维数组的本质时内存中连续的存储单元,而一维数组的名字就代表一维数组的首地址,知道了首地址我们自然可以推算出其他数组元素的地址。
举个例子
int a[5];
第一种一维数组元素表示方法
a[0] | a[1] | a[2] | a[3] | a[4] |
---|---|---|---|---|
a(一维数组名) | a+1 | a+2 | a+3 | a+4 |
第二种一维数组元素表示方法
&[0] &[1] &[2] &[3] &[4]
5.1 位置差
指向同一个数组的两个指针可以做差,其含义是两个元素的元素差
设int *q,*p;
p==q | p和q指向同一个位置 |
---|---|
p<q | p的位置指向在q指向位置的前面 |
p>q | p的位置指向在q指向位置的后面 |
利用位置差实现数组的逆置
#include <stdio.h>
int main()
{
int a[8]={
1,2,3,4,5,6,7,8};
int *p,*q;
int t,i;
p=a;
q=a+7;
for (;p<q;p++,q--) //利用的就是位置差
{
t=*p; *p=*q; *q=t; //交换的是内容
}
for (i=