5.1 指针与地址 (C)

 

指针与地址

——《C程序设计语言(第2版-新版)》5.1

 

   一元运算符&可用于取一个对象的地址,因此,下列语句:

 p = &c;

将把 c 的地址赋值给变了p,我们称 p 为“指向”c的指针。地址运算符&只能应用于内存中的对象,即变量与数组元素。它能作用于表达式常量register 类型的变量。

 

   一元运算符*是间接寻址或间接引用运算符。当它作用与指针时,将访问指针所指向的对象。我们在这里假定 x 与 y 是整数,而 ip 是指向 int 类型的指针,下面的代码说明了如何在程序中声明指针以及如何使用运算符&和*:


int  x  =   1 , y  =   2 , z[ 10 ];
int   * ip;    /*  ip is a pointer to int  */

ip 
=   & x;    /*  ip now points to x  */
=   * ip;    /*  y is now 1  */
* ip  =   0 ;    /*  x is now 0  */
ip 
=   & z[ 0 /*  ip now points to z[0]  */

 

  我们来看指针 ip 的声明,如下所示:

  int *ip;

这样声明是为了便于记忆。该声明语句表明表达式*ip的结果是int类型。这种声明变量的语法与声明该变量所在的表达式的语法类似。同样的原因,对函数的声明也可以采用这种方式。例如,声明:

  double *dp, atof(char *);

表明,在表达式中,*dp和atof(s)的值都是double类型,且atof的参数是一个指向char类型的参数。 

 

  我们应该注意,指针只能指向某种特定类型的对象,也就是说,每个指针都必须指向某种特定的数据类型。(一个例外情况是指向void类型的指针可以存放指向任何类型的指针,但它不能间接引用其自身。)。

 

  如果指针 ip 指向整形变量,那么在 x 可以出现的任何上下文中都可以使用 *ip,因此,语句

  *ip = *ip + 10;

将把*ip的值增加10。

 

  一元运算符*和&的优先级比算术运算符的优先级高,因此,赋值语句

  y = *ip + 1;

将把*ip指向的对象的值取出并加1,然后再将结果赋值给y,而下列赋值语句:

  *ip += 1;

则将 ip 指向的对象的值加1,它等同于

  ++*ip;  

  (*ip)++;

语句的执行结果。 语句(*ip)++中的圆括号是必须的,否则,该表达式将对 ip 进行加1运算,而不是对 ip 指向的对象进行加1运算,这是因为,类似于*和++这样的一元运算符遵循从右至左的结合顺序。

 

  最后说明一点,由于指针也是变量,所以在程序中可以直接使用,而不必通过间接引用的方法使用。例如,如果 iq 是另一个指向整形的指针,那么语句

  iq = ip;

将把 ip 中的值拷贝到 iq 中,这样,指针 iq 也将指向 ip 指向的对象。 

 

/*********************************

 * Last Edit By Old At 2009.12.26

 ********************************/ 

C程序设计语言_第2版新版.pdf  

转载于:https://www.cnblogs.com/bruceleeliya/archive/2009/12/26/1632798.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值