引言:C语言中一种重要的数据类型就是指针,指针是C语言的特色之一。
正确灵活地运用指针,可以使程序编写简洁,紧凑,高效。
利用指针变量可以有效地表示各种复杂的数据结构,如队列(queue)、栈(Stack)、链表(Linked Table)、树(Tree)、图(Graph)等等,正是由于复习数据结构,发现当时C语言指针学的一点都不好,指针这部分确实有点难,最近花了几天时间研究指针,总结了一下。
因此,熟练掌握和正确使用指针对一个成功的C语言程序设计人员来说是十分重要的。
正题:
学指针最重要的是记住两点:①指针=地址,地址=指针,指针相当于地址 ②画图,画图,画图 (画图可以很好理解,要不绕来绕去的,一会儿就晕了)
(1)首先,在计算机中,所有的数据都是以二进制形式存放在内存储器(简称内存)中的。
就是要画这个内存图。
名字 | 内存地址 | 内容 |
例如:a | 例如:0x6000 | 存放数据,变量, |
p1 | 0x6001 | |
.... | 0x6002 | |
0x6003 | ||
0x6004 | ||
0x6005 | ||
0x6006 | ||
0x6007 | ||
…… | …… |
访问内容那一列需要通过地址标号进行访问,可分为直接访问(寻址)和间接访问(寻址),指针相当于间接访问(寻址)。
直接寻址方式:可以直接通过变量地址对其存储单元进行操作
间接访问(寻址):就是一个变量a,里面存放内容,把a的地址放到另一个地址的内容中,这个变量叫p,这个p就可以认为是指针。直接画图吧,看的更清楚。
名字 | 内存地址 | 内容(存放数据,变量,) |
例如:a | 例如:0x6000 | 变量a的内容 |
0x6001 | ||
0x6003 | ||
0x6004 | ||
p(指针变量) | 0x6005 | 0x6000(p指针变量的内容为 地址 =指针) |
0x6006 | ||
0x6007 | ||
…… | …… |
(2)开始指针变量的定义(重点理解好 * 星号的用处)
① 指针变量定义的一般形式:
【类型修饰符】 数据类型 * 变量名列表;
例如:
int * p; // * 星号 是与变量名p分开的,p是指针变量,而不是*p是指针变量。
// 这个*星号很重要,表示后边跟的指针变量,不是普通变量
②指针变量的初始化
int *p=&a; //在这的*星号称为指针运算符或称为“间接访问内存地址”运算符;
//在定义时,通过它表明某个变量被定义为指针变量,
//而在使用时,*p表示p所指向的变量的内容。就是取内容,画图,画图,画图如下
p(指针变量) | 0x6005 | 0x6000(p指针变量的内容为 地址 =指针) |
*p 取的p的内容为0x6000,就是取的最后一列
例如:a | 例如:0x6000 | 变量a的内容 |
&a 是取a的地址,就是取的中间那一列。
把这个地址放到p中当做内容,这个地址就是指针。
最后还有一些相关名词,指针,指针变量,指针数组,数组指针,指针函数,函数指针,指针的指针,,要看最后一个名词是什么,以哪个名词结尾,
例如指针数组,最后一个名词是数组,说明它是一个数组,然后解释为一个由指针组成的数组(各个元素都是指针) char *p[10];
数组指针,数组名本身就是一个指针,指向数组的首地址,注意这是一个常数。 char (*p)[10];
暂时这么多。