admin管理员组

文章数量:1531791

说到指针,估计还是有很多小伙伴都还是云里雾里的,有点“知其然,而不知其所以然”。但是,不得不说,学了指针,C语言才能算是入门了。指针是C语言的精华,可以说,对对指针的掌握程度,直接决定了你C语言的编程能力。

在讲指针之前,我们先来了解下变量在内存中是如何存放的。

在程序中定义一个变量,那么在程序编译的过程中,系统会根据你定义变量的类型来分配相应尺寸的内存空间。那么如果要使用这个变量,只需要用变量名去访问即可。

通过变量名来访问变量,是一种相对安全的方式。因为只有你定义了它,你才能够访问相应的变量。这就是对内存的基本认知。但是,如果光知道这一点的话,其实你还是不知道内存是如何存放变量的,因为底层是如何工作的,你依旧不清楚。

那么如果要继续深究的话,你就需要把变量在内存中真正的样子是什么搞清楚。内存的最小索引单元是1字节,那么你其实可以把内存比作一个超级大的字符型数组。在上一节我们讲过,数组是有下标的,我们是通过数组名和下标来访问数组中的元素。那么内存也是一样,只不过我们给它起了个新名字:地址。每个地址可以存放1字节的数据,所以如果我们需要定义一个整型变量,就需要占据4个内存单元。

那么,看到这里你可能就明白了:其实在程序运行的过程中,完全不需要变量名的参与。变量名只是方便我们进行代码的编写和阅读,只有程序员和编译器知道这个东西的存在。而编译器还知道具体的变量名对应的内存地址,这个是我们不知道的,因此编译器就像一个桥梁。当读取某一个变量的时候,编译器就会找到变量名所对应的地址,读取对应的值。

初识指针和指针变量
那么我们现在就来切入正题,指针是个什么东西呢?

所谓指针,就是内存地址(下文简称地址)。C语言中设立了专门的指针变量来存储指针,和普通变量不一样的是,指针变量存储的是地址。

定义指针
指针变量也有类型,实际上取决于地址指向的值的类型。那么如何定义指针变量呢:

很简单:类型名* 指针变量名

charpa;//定义一个字符变量的指针,名称为paintpb;//定义一个整型变量的指针,名称为pbfloat*pc;//定义一个浮点型变量的指针,名称为pc

C

注意,指针变量一定要和指向的变量的类型一样,不然类型不同可能在内存中所占的位置不同,如果定义错了就可能导致出错。

取地址运算符和取值运算符

获取某个变量的地址,使用取地址运算符&,如:

charpa=&a;intpb=&f;

如果反过来,你要访问指针变量指向的数据,那么你就要使用取值运算符*,如:

printf("%c, %d\n",*pa,*pb);

这里你可能发现,定义指针的时候也使用了*,这里属于符号的重用,也就是说这种符号在不同的地方就有不同的用意:在定义的时候表示定义一个指针变量,在其他的时候则用来获取指针变量指向的变量的值。

直接通过变量名来访问变量的值称之为直接访问,通过指针这样的形式访问称之为间接访问,因此取值运算符有时候也成为间接运算符。

比如:

//Example
01//代码来源于网络,非个人原创#include<stdio.h>intmain(void){chara=‘f’;intf=123;charpa=&a;intpf=&f;printf(“a
= %c\n”,*pa);printf(“f = %d\n”,*pf);*pa=‘c’;*pf+=1;printf(“now, a = %c\n”,*pa);printf(“now, f = %d\n”,*pf);printf(“sizeof pa =
%d\n”,sizeof(pa));printf(“sizeof pf = %d\n”,sizeof(pf));printf(“the
addr of a is: %p\n”,pa);printf(“the addr of f is: %p\n”,pf);

本文标签: 指针语言