LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1026|回复: 0

C语言指针 非权威教程

[复制链接]
发表于 2008-5-7 13:14:30 | 显示全部楼层 |阅读模式
程序运行时,数据储存在储存器(内存、硬盘和中央处理器寄存器),大部分时候,程序相关数据都
存储在内存。


“内存块储存变量 int a = 1 的”可以简单具体为:
  1. +------+
  2. |  1   |    变量的值
  3. +------+
  4. |  a   |    变量的名称
  5. +------+
  6. | 0001 |    变量在内存中的地址
  7. +------+
复制代码



像 int a = 1 这种赋值定义后,变量的值,变量的名称和变量的地址都是一一对应的,所以,只要
知道变量的名称或地址就能知道变量的值。



!!为了讲解重点,下面省略了变量名称 a 和地址的对应关系。
  1. +---------+
  2. |    1    |    变量的值
  3. +---------+
  4. | 0001(a) |    变量在内存中的地址
  5. +---------+
复制代码



要改变变量 a 的值为 2,可以使用:
  1. a = 2;
复制代码


  1. +---------+
  2. |    2    |    变量的值
  3. +---------+
  4. | 0001(a) |    变量在内存中的地址
  5. +---------+
复制代码



通过标识符 a 来访问变量 a 的值称为“直接访问”。

对应地,通过变量 a 地址来访问变量 a 的值称为“间接访问”。


声明一个变量用于储存另一个变量的地址:
  1. int *a_p;
复制代码


变量 a_p 前有一个星号表示它是一种特殊变量,只能储存 int 类型变量的地址。


把变量 int a 的地址储存到变量 a_p:
  1. a_p = &a;
复制代码


变量 a 前加一个德尔塔符表示寻找它的地址出来,德尔塔符又称为“寻地址符”。

  1. +---------+      +-----------+
  2. |    2    |      |    0001   |   变量的值
  3. +---------+  ... +-----------+
  4. | 0001(a) |      | 0100(a_p) |   变量在内存中的地址
  5. +---------+      +-----------+
复制代码



通过变量 a 的地址来访问变量 a 的值:
  1. printf(" a = %d ", *a_p);
复制代码


变量 a_p 前加一个星号表示把它的储存的地址 0001 所对应的值寻找出来。由于这时的星号表示“
寻找某地址对应的值”,它被称为“取值符”。


特别要注意,声明 int *a_p 与 printf(" a = %d ", *a_p) 中的星号名称和作用都不一样,前者
表示“a_p 是一种特殊变量,只能储存 int 类型变量的地址”,后者表示“寻找 a_p 所储存的地址
对应的值”。


通过变量 a 的地址改变变量 a 的值:
  1. *a_p = 4;
  2. printf(" a = %d ", *a_p);
  3. printf(" a = %d ", a);
复制代码


变量 a_p 前加星号表示修改“ a_p 所储存的地址对应的变量”的值,而不是变量 a_p 自身的值 0001。


有了基础后,可以马上细品《The C Programming Language,Second Edition》中指针一章,深入学习指针。


参考文献
《The C Programming Language,Second Edition》,Brian W. Kernighan & Dennis M. Ritchie 著
《Expert C Programming:Deep C Secrets》,Peter Van Der Linden 著

/*
*
* Power by shuge.org & lee
*
* Last Modified: 2008-05-07
*
*/
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表