何为指针(原创)

robertnet 2003-11-01 08:01:55
以下是本人对指针的一点浅薄理解:
例子1 :
int* Ptr; 我们这样理解,*Ptr是一个int型变量,*Ptr的意思是把变量Ptr的值当地址使用。简单一句,Ptr是一个地址,根据这个地址可以存取一个int型变量。Ptr是一个int指针。
例子2:
int* Array[3];
Array[3]是一个有三个元素的数组,每个元素都作地址使用,按这个地址可以存取一个int型变量。简单一句,Array[3]是一个由三个int指针组成的数组。
例子3:
int* Function()
Fun()是一个无参函数,它的返回值被当作地址来使用,根据这个地址可以存取一个int型变量。简单一句,Function()是一个返回int指针的无参函数。
对指针最基本的用法作了一个回顾之后,现在我们来尝试对指针和数组的共同点和不同点来作一个简要的分析:
A:相同点:
1:指针和数组的名字都代表某种类型的变量地址。
2:编译器赋予Array[i]与*(Array + i)相同的解释,即运算符[]与*是等价的。
3:指针与数组名在作函数参数时,完全等同。For example: int Function(int Array[]); 和 int Function(int* Array)是完全等同的。
B:不同点:
1:指针是变量,编译器为指针分配地址空间,且指针的值可以在运行时随时改变。数组名相当于一个常量,编译器不会为数组名本生分配空间,而且不能修改数组名的首地址。
关于B(1)的不能修改数组首地址之例外情况的思考:当数组名作参数时,参数被压入栈,数组名相当于有了自己的存储空间(栈内),于是就可以象修改指针一样修改(栈内)数组之名。
关于前一段时间一帖谈到“数组根本不存在,只有指针”的话题,本人支持这个观点:
理由1:在函数参数中,指针是完全可以替代指针的。For example: int Function(int Array[]); ---> int Function(int* Array);又如,int Function(int Array[][i]); ---> int Function(int (*Array)[i]);
理由2:不作参数时,一维数组完全可以用一个指针来实现。int Array[3] = {0, 1, 2};等同于int* Array = new int(); *(Array) = 0; *(Array + 1) = 1; *(Array + 2) = 2;一维数组就可以这样用指针来实现。当然最后别忘了delet[] Array;
理由3:不做参数时,二维数组也可以用指针来表示,这是又二维数组的特性决定的。int Array[5][6]; 假定&Array[0][0] == XXX;则&Array[2][2]为XXX + (4 * 5) * 2 + 4 * 2 == XXXX + 48.所以,同理按理由2的方法,可以用指针来替代二维数组。如果再仔细想想,也能用指针来实现三维、多维数组。
...全文
17 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2003-11-09
  • 打赏
  • 举报
回复
写得都很好!
playboyxp 2003-11-09
  • 打赏
  • 举报
回复
可以出书了
vcforever 2003-11-08
  • 打赏
  • 举报
回复
恩,总结的很好啊!
fierygnu 2003-11-08
  • 打赏
  • 举报
回复
1、关于B(1)的不能修改数组首地址之例外情况的思考:这个说法不对。标准说法是在这个时候数组退化为指针了,这也是无法用该指针得到原来数组大小的原因,即C语言里没有真正的数组的含意。
2、理由1:在函数参数中,指针是完全可以替代指针的。这个说法也不对。指针与数组其实是不同的,尤其是多维数组和多维指针,这一点分析一下存储方式就明白了。传递到函数中后,因为数组退化为指针,编译器无法得到原来数组的大小,是无法按数组解释的。

robertnet 2003-11-08
  • 打赏
  • 举报
回复
等高人指点
robertnet 2003-11-06
  • 打赏
  • 举报
回复
等高人。
herrycsdn 2003-11-02
  • 打赏
  • 举报
回复
不错,关注学习
fierygnu 2003-11-02
  • 打赏
  • 举报
回复
http://chinaunix.net/forum/viewtopic.php?t=122740
TianGuangZao 2003-11-02
  • 打赏
  • 举报
回复
讲到概念性问题,就不客气了,毕竟搞清楚最要紧。首先例一就不敢恭维了。
int* Ptr; 就简单表示定义一个 pointer to int,而没有其它的意思。
这里你却把 *p 单独提出来,讲成:
“*Ptr 是一个int型变量,”
搞的莫名其妙。Ptr 都还没初始化,就用 *Ptr 来解引用,合适吗?谁也不知道 Ptr 到底指向的是那种类型的对象,如何得知“*Ptr 是一个int型变量“ 呢?
”*Ptr的意思是把变量Ptr的值当地址使用。”
明显讲错了,Ptr 是指针变量,本身它的值就是地址,虽然没初始化,是个野指针,包含的是垃圾地址。*Ptr 还是地址吗?显然不是,解引用后就是指针 Ptr 所指向的对象的值。
你在这里犯的错误就是把定义时的 int *Ptr;和使用中 int a; Ptr = &a; *Ptr = 5; 两处的 * 等同起来了,要知道同一符合在不同的场合会有不同的解释。前者简单的说明定义的是一个指针,后者则是对指针进行解引用操作。

其它留给大伙来评论吧!

WindFroce 2003-11-02
  • 打赏
  • 举报
回复
好,指针向把钥匙,他能帮助你打开你想要开的门,而这个门就是你要访问的对象.
寻找一起奋斗的程序员们,一起热爱c++的人们,C++永远存在

qq;22723754
qaz163 2003-11-01
  • 打赏
  • 举报
回复
up
ctor 2003-11-01
  • 打赏
  • 举报
回复
文章写的很好啊!
不过
我认为有一点小问题,不知道对不对
比如
在例1中的最后一句改为ptr是指向int型的指针比较好
catf1sh 2003-11-01
  • 打赏
  • 举报
回复
学习。
vmape 2003-11-01
  • 打赏
  • 举报
回复
理由1:在函数参数中,指针是完全可以替代指针的。

说错了。^_^
瑕不掩瑜,很好的文章啊。

不过数组还是有它的方便的,否则你存取一个数据要写上一堆的加减,多不爽啊。
^_^
Andy84920 2003-11-01
  • 打赏
  • 举报
回复
指针像是一个线索.
用来寻址.
leyt 2003-11-01
  • 打赏
  • 举报
回复
总结得不错。
williamVII 2003-11-01
  • 打赏
  • 举报
回复
来帮你顶

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧