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