[原创]C语言指针 非权威教程

软件和网站开发以及相关技术探讨
回复
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28

[原创]C语言指针 非权威教程

#1

帖子 flyinflash » 2008-05-07 13:02

程序运行时,数据储存在储存器(内存、硬盘和中央处理器寄存器),大部分时候,程序相关数据都
存储在内存。


“内存块储存变量 int a = 1 的”可以简单具体为:

代码: 全选

+------+
|  1   |    变量的值
+------+
|  a   |    变量的名称
+------+
| 0001 |    变量在内存中的地址
+------+

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



!!为了讲解重点,下面省略了变量名称 a 和地址的对应关系。

代码: 全选

+---------+
|    1    |    变量的值
+---------+
| 0001(a) |    变量在内存中的地址
+---------+

要改变变量 a 的值为 2,可以使用:

代码: 全选

a = 2;

代码: 全选

+---------+
|    2    |    变量的值
+---------+
| 0001(a) |    变量在内存中的地址
+---------+

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

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


声明一个变量用于储存另一个变量的地址:

代码: 全选

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


把变量 int a 的地址储存到变量 a_p:

代码: 全选

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

代码: 全选

+---------+      +-----------+
|    2    |      |    0001   |   变量的值
+---------+  ... +-----------+
| 0001(a) |      | 0100(a_p) |   变量在内存中的地址
+---------+      +-----------+

通过变量 a 的地址来访问变量 a 的值:

代码: 全选

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


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


通过变量 a 的地址改变变量 a 的值:

代码: 全选

*a_p = 4;
printf(" a = %d ", *a_p);
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
*
*/
上次由 flyinflash 在 2008-05-09 22:42,总共编辑 1 次。
头像
lovewine
帖子: 1233
注册时间: 2006-03-25 10:36
联系:

#2

帖子 lovewine » 2008-05-07 18:57

楼主辛苦了,简洁,但太简洁了。
让自由的声音传传传传传传传传天下。。。
Spread the words of freedom.
头像
yangcheng
帖子: 498
注册时间: 2005-09-27 18:24
来自: 杭州

#3

帖子 yangcheng » 2008-05-07 21:48

的确太简洁了点
头像
solcomo
帖子: 2838
注册时间: 2007-04-25 13:12

#4

帖子 solcomo » 2008-05-07 21:53

入门不错
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♙♙♙♙♙♙♙♙
♖♘♗♕♔♗♘♖

☠☯⚔⚓☣☦☃☕
☹☻☪☭☬⚖⚛⚜
ℜℳℬ™ ℋℯℓ℘ ℳℭ
sƂɐʍ рǀɹoʍ əɥʇ oS
头像
percy
帖子: 508
注册时间: 2006-09-10 8:19
系统: Gentoo/Mac OS X
来自: Shanghai,China
联系:

#5

帖子 percy » 2008-05-09 18:42

看了一下,确实简洁,不错
kevin.c
帖子: 145
注册时间: 2008-04-01 12:28

#6

帖子 kevin.c » 2008-05-09 18:57

指针的奥秘可不只这一点
连皮毛都不算
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28

#7

帖子 flyinflash » 2008-05-09 22:32

有了基础后,可以马上细品《The C Programming Language,Second Edition》中指针一章,深入学习指针。
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28

#8

帖子 flyinflash » 2008-05-09 22:37

请不要试图进行恶意的抨击,
请您尝试了解和理解我想表达思想。
回复