当前位置 首页 C语言设计第三版 第36章

《C语言设计第三版》第36章

作者:谭浩强 字数:1489 书籍:C语言设计第三版

  需要注意的是指针运算符*和指针变量说明中的指针说明符*不是一回事。在指针变量说

  明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运

  算符用以表示指针变量所指的变量。

  【例 10.6】

  main(){

  int a=5,*p=&a;

  printf ("%d",*p);

  }

  表示指针变量 p 取得了整型变量 a 的地址。printf("%d",*p)语句表示输出变量 a 的值。

  2. 指针变量的运算

  1) 赋值运算:指针变量的赋值运算有以下几种形式。

  ① 指针变量初始化赋值,前面已作介绍。

  ② 把一个变量的地址赋予指向相同数据类型的指针变量。

  例如:

  int a,*pa;

  pa=&a; /*把整型变量 a 的地址赋予整型指针变量 pa*/

  ③ 把一个指针变量的值赋予指向相同类型变量的另一个指针变量。

  如:

  int a,*pa=&a,*pb;

  pb=pa; /*把 a 的地址赋予指针变量 pb*/

  由于 pa,pb 均为指向整型变量的指针变量,因此可以相互赋值。

  ④ 把数组的首地址赋予指向数组的指针变量。

  例如:

  int a[5],*pa;

  pa=a;

  (数组名表示数组的首地址,故可赋予指向数组的指针变量 pa)

  也可写为:

  pa=&a[0]; /* 数 组 第 一 个 元 素 的 地 址 也 是 整 个 数 组 的 首 地 址 ,

  也可赋予 pa*/

  当然也可采取初始化赋值的方法:

  int a[5],*pa=a;

  ⑤ 把字符串的首地址赋予指向字符类型的指针变量。

  例如:

  char *pc;

  pc="C Language";

  或用初始化赋值的方法写为:

  谭浩强 C 语言程序设计 2001 年 5 月 1 日

  char *pc="C Language";

  这里应说明的是并不是把整个字符串装入指针变量,而是把存放该字符串的字符数

  组的首地址装入指针变量。在后面还将详细介绍。

  ⑥ 把函数的入口地址赋予指向函数的指针变量。

  例如:

  int (*pf)();

  pf=f; /*f 为函数名*/

  2) 加减算术运算

  对于指向数组的指针变量,可以加上或减去一个整数 n。设 pa 是指向数组 a 的指针变

  量,则 pa+n,pa-n,pa++,++pa,pa--,--pa 运算都是合法的。指针变量加或减一个整数 n 的意

  义是把指针指向的当前位置(指向某数组元素)向前或向后移动 n 个位置。应该注意,数组指

  针变量向前或向后移动一个位置和地址加 1 或减 1 在概念上是不同的。因为数组可以有不同

  的类型,各种类型的数组元素所占的字节长度是不同的。如指针变量加 1,即向后移动 1 个

  位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加 1。例如:

  int a[5],*pa;

  pa=a; /*pa 指向数组 a,也是指向 a[0]*/

  pa=pa+2; /*pa 指向 a[2],即 pa 的值为&pa[2]*/

  指针变量的加减运算只能对数组指针变量进行,对指向其它类型变量的指针变量作加减

  运算是毫无意义的。

  3) 两个指针变量之间的运算:只有指向同一数组的两个指针变量之间才能进行运算,否则

  运算毫无意义。

  ① 两指针变量相减:两指针变量相减所得之差是两个指针所指数组元素之间相差的元

  素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。

  例如 pf1 和 pf2 是指向同一浮点数组的两个指针变量,设 pf1 的值为 2010H,pf2

  的 值 为 2000H , 而 浮 点 数 组 每 个 元 素 占 4 个 字 节 , 所 以 pf1-pf2 的 结 果 为

  (2000H-2010H)/4=4,表示 pf1 和 pf2 之间相差 4 个元素。两个指针变量不能进行

  加法运算。 例如,pf1+pf2 是什么意思呢?毫无实际意义。

  ② 两指针变量进行关系运算:指向同一数组的两指针变量进行关系运算可表示它们所

  指数组元素之间的关系。

  例如:

  pf1==pf2 表示 pf1 和 pf2 指向同一数组元素;

  pf1>pf2 表示 pf1 处于高地址位置;

  pf1

  指针变量还可以与 0 比较。

  设 p 为指针变量,则 p==0 表明 p 是空指针,它不指向任何变量;

  p!=0 表示 p 不是空指针。

  空指针是由对指针变量赋予 0 值而得到的。

  例如:

  #define NULL 0

  int *p=NULL;

  谭浩强 C 语言程序设计 2001 年 5 月 1 日

  对指针变量赋 0 值和不赋值是不同的。指针变量未赋值时,可以是任意值,是

  不能使用的。否则将造成意外错误。而指针变量赋 0 值后,则可以使用,只是它不

  指向具体的变量而已。

  【例 10.7】

  main(){

  int a=10,b=20,s,t,*pa,*pb; /*说明 pa,pb 为整型指针变量*/

  pa=&a; /*给指针变量 pa 赋值,pa 指向变量 a*/

  pb=&b; /*给指针变量 pb 赋值,pb 指向变量 b*/

  s=*pa+*pb; /*求 a+b 之和,(*pa 就是 a,*pb 就是 b)*/

  t=*pa**pb; /*本行是求 a*b 之积*/

  printf("a=%d\nb=%d\na+b=%d\na*b=%d\n",a,b,a+b,a*b);

  printf("s=%d\nt=%d\n",s,t);

  }

  【例 10.8】

  main(){

  int a,b,c,*pmax,*pmin; /*pmax,pmin 为整型指针变量*/

  printf("input three numbers:\n"); /*输入提示*/

  scanf("%d%d%d",&a,&b,&c); /*输入三个数字*/

  if(a>b){ /*如果第一个数字大于第二个数字...*/

  pmax=&a; /*指针变量赋值*/

  pmin=&b;} /*指针变量赋值*/

  else{

  pmax=&b; /*指针变量赋值*/

  pmin=&a;} /*指针变量赋值*/

  if(c>*pmax) pmax=&c; /*判断并赋值*/

  if(c<*pmin) pmin=&c; /*判断并赋值*/

  printf("max=%d\nmin=%d\n",*pmax,*pmin); /*输出结果*/

  }

  10.3 数组指针和指向数组的指针变量

  一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,

  它们都有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的

  地址。

  10.3.1 指向数组元素的指针

  一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元的首地址。一

  个数组也是由各个数组元素(下标变量)组成的。每个数组元素按其类型不同占有几个连续的

  谭浩强 C 语言程序设计 2001 年 5 月 1 日

  内存单元。一个数组元素的首地址也是指它所占有的几个内存单元的首地址。

  定义一个指向数组元素的指针变量的方法,与以前介绍的指针变量相同。

目录
设置
设置
阅读主题
字体风格
雅黑 宋体 楷书 卡通
字体风格
适中 偏大 超大
保存设置
恢复默认
手机
手机阅读
扫码获取链接,使用浏览器打开
书架同步,随时随地,手机阅读
收藏
听书
听书
发声
男声 女生 逍遥 软萌
语速
适中 超快
音量
适中
开始播放
反馈
章节报错
当前章节
报错内容
提交
加入收藏 < 上一章 回到书页 下一章 > 错误反馈

设为首页加入收藏保存桌面网址发布会员中心留言本

Copyright © 2024-2025 All Rights Reserved