IT小菜鸟,年后考研复试要考C,所以寒假就重温了一下C语言,看到指针这个曾经让我10分恶心的东东,决定记录下点东西,一来当成笔记,二来可以帮助一些刚刚入门的小伙伴们深刻理解一下指针这玩意。如果有哪里说得不对,欢迎大家批评指正。
首先,我们要区分两个概念。
1 指针
2指针变量
反正我个人学习的时候,这两个概念就经常弄混,所以,我觉得要想理解指针,就必须严格根清这两个概念。从定义上来看,这两个东东完全是两个不同的东西
首先来看指针,指针是个非常抽象的概念。众所周知,计算机系统的存储地址是一个遵循一定规则(这个规则我不会,暂时先这么说,大家原谅一下我的无知)的二进制数,例如2000,11111,这样的二进制数,如果实在感觉我说的陌生,大家可以去找一本《计算机组成原理》看一下,里面有详细介绍。那么话说回来,指针到底是什么?简而言之,指针就是(存储)地址,计算机内部任何一个地址都可以叫做指针,换句话说,指针是C语言对存储地址的另一种说法(专业的),在具体点,指针是一个二进制数,代表一个计算机内部存储地址。
指针变量一定是指针,但是指针不一定是指针变量
接下来,让我们看一下指针变量。我最想强调的就是最后两个字,变量!!什么意思?意思是指针变量和指针是不一样的啊,指针变量是一个变量啊!变量包括什么?
包括:1变量名 2变量值 3变量类型 4变量值
接下来,我们要了解两个操作符
*:取值操作符,操作对象是地址,也就是指针,通过地址查到所对应的值
&:取地址操作符,操作对象是变量,通过变量名取得变量的地址
大家一定要记清楚这两个操作符的作用!!特别是 * ,千万不要和后面指针变量定义中的 * 混为一谈!为了加深大家的理解,我们通过几个简单的C语言语句给大家解释一下。
首先写一个C语言语句:
int i=1;
在这个语句中,我们进行了一个变量的声明和赋值。具体分析如下:
变量名:i 变量类型:int(整形) 变量值:1 变量地址:(假设是这个地址)20000
好,那么我们就对 i 这个变量了解的很充分了,接下来分析另外一句话。
int i=1;(假设i的地址是20000)
int *p=&i; //指针变量定义
抛去int i =1;不看,我们看 int *p = &i; 分析:
变量名:p 变量类型:int型指针 变量值:20000 变量地址:(假设)22000
这样看来,就很简单明了,语句的作用就是定义一个int型指针的变量p,也就是我们俗称的(int型)指针变量,通过&操作符得到变量 i 的地址,将这个地址赋值给 p ,之后我们就可以通过指针变量 p(已获得i的地址)来访问 变量i了。
最后还要再说一句,int *p=&i;中的 * 不是取值操作符,这时候的 * 可以理解为一个关键字,和int共同构成变量类型int*,即整型指针。那什么时候是取值操作符呢?
例如 printf("%d\n",*p);
通过前面我们知道,p的值是变量 i 的地址,那么*的作用就从p所代表的的地址中取出地址对应的值,所以被叫做取值操作符··
至于指针的好处之类的我就不赘述了,毕竟我觉得指针的难点就是这了。最后贴上完整代码和运行结果;
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=200;//定义int型变量,值为200
int *p;//定义int型指针变量p
p=&i;//将变量i的地址赋给p
printf("变量i的值:%d\n",*p);//通过取值操作符*得到i的值
return 0;
}
运行结果:
变量i的值:200