版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指针是C语言中的一个重要概念。掌握指针的用
法,可使程序简洁、高效、灵活,但并不难学。
为了了解什么是指针,先看一个小故事
地下工作者阿金接到上级指令,要去寻找打开
密电码的密钥,这是一个整数。几经周折,才探知
如下线索,密钥藏在一栋三年前就被贴上封条的小
楼中。一个风雨交加的夜晚,阿金潜入了小楼,房
间很多,不知该进哪一间,正在一筹莫展之际,忽
然走廊上的电话铃声响起。艺高人胆大,阿金毫不
迟疑,抓起听筒,一个陌生人说:“去打开211房
间,那里有线索”。阿金疾步上楼,打开211房间,
用电筒一照,只见桌上赫然6个大字:地址1000。
阿金眼睛一亮,迅速找到1000房间,取出重要数据
66,完成了任务。2
我们画出下图
pI---------
1000•••66•••
2111000
1、数据藏在一个内存地址单元中,地址是1000。
2、地址1000又由P单元所指认,P单元的地址为211。
3、66的直接地址是1000;66的间接地址是211;211中
存的是直接地址1000。
4、称P为指针变量,1000是指针变量的值,实际上是有
用数据藏在存储器中的地址。3
指针变量——用来存放另一变量地址的变量
变量的指针就是变量的地址。
1、指针的概念
指针是一种特殊的变量,特殊性表现在类型和值上。
从变量讲,指针也具有变量的三个要素:
>(1)变量名,这与一般变量取名相同,由英文字符开始。
>(2)指针变量的类型,是指针所指向的变量的类型,而不
是自身的类型。
>(3)指针的值是某个变量的内存地址。
从上面的概念可知,指针本身类型是int型,因为任何内存地
址都是整型的。但是指针变量的类型却定义成它所指向的
变量的类型。
2、指针的定义(说明,先说明后引用)
例如:
int*q;//定义p,q为指向整数类型变量的指针
float*point;//定义point为指向float型变量的指针
double*pd;//定义pd为指向double型数组的指针
intrpa)[10];//定义pa为指向int型数组的指针
intCpu)0;//定义pu为指向int型函数的指针
int**qq;//定义qq为指向int型指针的指针
还有指向结构、联合的指针,后面再介绍
3、指针赋值
例
intakey;//定义一个整型变量akey
int*p,*q;//定义P,q为指向整型变量的指针变量
akey=66;//将变量a的地址赋给p,这时见图1
q=P;//将P的值赋给q,见图2
p
&a66
图1
&P
P变量的地址a变量的地址
图1的说明:将a变量的地址赋给指针p,意味着让指针
p指向a
6
p
/&a------------166
~~Sip
/图2
q=p;I
&q
图2的说明:当着执行q=p;之后,p中所存的a变量的
地址值,也就被放到q变量中,意味着让指
针q也指向a
7
〃指针1.C
#include<stdio.h>//预编译命令
voidmain()〃主函数
(//函数体开始
inta[5]={0,l,2,3,4};〃定义数组,赋初值
int*pl,*p2;//定义指针变量
pl=&a[l];//赋值给指针变量,让pl指向a[l]
p2=&a[2];//赋值给指针变量,让pl指向a[2]
printf(na[l]=%d;a[2]=%d\nfVpl,*p2);〃输出a[l]和a[2]的值
}
说明:见图
01234
&a[0]&a[l]&a[2]&a[3]&a[4]
&a[l]][&a[2]
&pl&p2▼
pl和p2分别指向a[l]闺2];这里
>&——取地址运算符
>*——指针运算符(间接访问运算符)
>*pl——间接访问pl所指向的内存单元,当然是输出a[l]的值
>*p2——间接访问p2所指向的内存单元,当然是输出a[2]的值
4、向指针所指向的内存单元赋值
//指针2.c
#include<stdio.h>//预编译命令
voidmainQ〃主函数
〃函数体开始
intakey,b;〃定义整型变量
int*p,*q;〃定义指针变量
akey=66;〃赋值给变量akey
p=&akey;〃赋值给指针变量p,让p指向变量akey
q=&b;〃赋值给指针变量q,让q指向变量b
*q=*p;〃将P所指向的akey的值赋给q所指向的变量b
printf(Mb=%d\nn,b);〃输出b的值
printf("*q=%d\n",*q);〃输出b的值
卜〃函数体结束
10
p
&b
11
5、指针与数组
先看一个程序
//指针3.c
#include<stdio.h>〃预编译命令
voidmain()〃主函数
//函数体开始
inta[5]={l,3,5,7,9};//定义数组,赋初值
int*p;〃定义指针变量
inti;//定义整型变量
P=a;//赋值给指针变量,让p指向a数组
for(i=0;i<5;i=i+l)
{〃循环体开始
printf("a[%d]=%d\n"J,*p);//输出a数组元素的值
P=P+1;〃指针变量加1
}//循环体结束
//函数体结束
}投
说明
>(l)p=a;这里数组名作为数组的起始地址,即a[0]的地址。
因此p=a等效于p=&a[O];
>(2)p=p+l;如p指向a[0],贝ljp=p+l之后,p指向a[l]
>(3)如果p=a等效于p=&a[O];
做下面的实验
//指针4.c
#include<stdio.h>〃预编译命令
voidmain()〃主函数
//函数体开始
inta[5]={l,3,5,7,9};//定义数组,赋初值
int*p;〃定义指针变量
inti=0;//定义整型变量,赋初值
for(p=a;p<a+5;p=p+1)//赋值给指针变量,让p指向a数组
〃循环体开始
printf(na[%d]=%d\nn*p);〃输出a数组元素的值
i=i+l;〃让加1
}〃循环体结束
}//函数体结束
14
数组名是一个常量指针,指向该数组的首地址,例
//指针5.c
#include<stdio.h>
voidmain()
char*p;〃定义指向字符类型的指针变量p
staticchars[]="abcdefgh”;//定义字符数组,并赋值
p=s;〃数组名是一个常量指针,
〃它指向该数组首地址,
while(*p!=,\(F)//当p所指向的数组元素不为八(F时
{
p=p+l;〃让指针加1
}
printf(“字串长度为%d\n”,p.s);〃输出字串长
}
15
012345678
abCd°fgh\0
sP
图中数组的首地址是s[0]的地址,即&s[0]。s可看
作是指向s[0]的指针。s是不会动的,是常量指
针。
数组名是一个常量指针,指向该数组的首地址,例
//指针6.c
#include<stdio.h>//预编译命令
voidmain()〃主函数
//函数体开始
staticcharshuzi[]="987654321”;〃定义数组,
〃赋初值为数字字符串
char*p=&shuzi[8];//让指针p指向shuzi[8]元素,
〃该处是字符
do〃直到型循环
〃循
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论