第九讲指针
1
指针是C语言中的一个重要概念。掌握指针的用法,可使程序简洁、高效、灵活,但并不难学。
为了了解什么是指针,先看一个小故事地下工作者阿金接到上级指令,要去寻找打开密电码的密钥,这是一个整数。几经周折,才探知如下线索,密钥藏在一栋三年前就被贴上封条的小楼中。一个风雨交加的夜晚,阿金潜入了小楼,房间很多,不知该进哪一间,正在一筹莫展之际,忽然走廊上的电话铃声响起。艺高人胆大,阿金毫不迟疑,抓起听筒,只听一个陌生人说:“去打开211房间,那里有线索”。阿金疾步上楼,打开211房间,用电筒一照,只见桌上赫然6个大字:地址1000。阿金眼睛一亮,迅速找到1000房间,取出重要数据66,完成了任务。
2
我们画出下图
1000
…
66
…
211
1000
P
说明:
1、数据藏在一个内存地址单元中,地址是1000。
2、地址1000又由P单元所指认,P单元的地址为211。
3、66的直接地址是1000;66的间接地址是211;211中存的是直接地址1000。
4、称P为指针变量,1000是指针变量的值,实际上是有用数据藏在存储器中的地址。
3
指针变量——用来存放另一变量地址的变量变量的指针就是变量的地址。
1、指针的概念
指针是一种特殊的变量,特殊性表现在类型和值上。
从变量讲,指针也具有变量的三个要素:
(1)变量名,这与一般变量取名相同,由英文字符开始。
(2)指针变量的类型,是指针所指向的变量的类型,而不是自身的类型。
(3)指针的值是某个变量的内存地址。
4
从上面的概念可知,指针本身类型是int型,因为任何内存地址都是整型的。但是指针变量的类型却定义成它所指向的变量的类型。
2、指针的定义(说明,先说明后引用)
例如:
int *p, *q; // 定义p,q为指向整数类型变量的指针
float *point; // 定义point为指向float型变量的指针
double *pd; // 定义pd为指向double型变量的指针
int (*pa)[10]; // 定义pa为指向int型数组的指针
int (*pu)(); // 定义pu为指向int型函数的指针
int **qq; // 定义qq为指向int型指针的指针
还有指向结构、联合的指针,后面再介绍
5
3、指针赋值
例
int akey; // 定义一个整型变量akey
int *p,*q; // 定义p,q为指向整型变量的指针变量
akey=66; // 将66赋给akey
p = &akey; //将变量akey的地址赋给p,这时见图1
q = p; // 将p的值赋给q,见图2
6
q = p; // 将p的值赋给q,见图2
7
//
#include <> //预编译命令
void main() //主函数
{ //函数体开始
int a[5]={0,1,2,3,4}; //定义数组,赋初值
int *p1,*p2; //定义指针变量
p1=&a[1]; //赋值给指针变量,让p1指向a[1]
p2=&a[2]; //赋值给指针变量,让p2指向a[2]
printf("a[1]=%d;a[2]=%d\n",*p1,*p2); //输出a[1]和a[2]的值
} //函数体结束
8
说明:见图
0
1
2
3
4
&a[0]
&a[1]
&a[2]
&a[3]
&a[4]
&a[1]
&a[2]
&p1
&p2
p1
p2
p1和p2分别指向a[1],a[2],这里
& ——取地址运算符
* ——指针运算符(间接访问运算符)
*p1——间接访问p1所指向的内存单元,当然是输出a[1]的值
*p2——间接访问p2所指向的内存单元,当然是输出a[2]的值
9
//
#include <> //预编译命令
void main() //主函数
{ //函数体开始
int akey,b; //定义整型变量
int *p,*q; //定义指针变量
akey=66; //赋值给变量akey
p=&akey; //赋值给指针变量p,让p指向变量akey
q=&b; //赋值给指针变量q,让q指向变量b
*q=*p; //将p所指向的akey的值赋给q所指向的变量b
printf("b=%d\n",b); //输出b的值
printf("*q=%d\n",*q); //输出b的值
} //函数体结束
4、向指针所指向的内存单元赋值
10
计算机程序设计基础——第九讲[1] 来自淘豆网m.daumloan.com转载请标明出处.