标题:资深学者,你好,请教一个指针基础问题
只看楼主
wubbin
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2004-8-6
 问题点数:0 回复次数:35 
资深学者,你好,请教一个指针基础问题

以下程序从理论上是正确的还是错误的? 在TC++ 3.0 环境没有任何编译和连接的警告或错误,运行结果正确。

我想问的核心问题是:程序没有明确地为指针p分配地址,这时会自动分配合理地址吗?会不会胡乱分配?可能我们多数时不这样使用指针,但是我必须把它搞明白。请指教。

#include "stdio.h"

void main() { int *p; *p=77; printf("%d\n",*p); }

搜索更多相关主题的帖子: 指针 学者 基础 核心 
2004-08-06 09:12
yms123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:209
帖 子:12488
专家分:19042
注 册:2004-7-17
得分:0 
以下是引用wubbin在2004-08-06 09:12:50的发言:

以下程序从理论上是正确的还是错误的? 在TC++ 3.0 环境没有任何编译和连接的警告或错误,运行结果正确。

我想问的核心问题是:程序没有明确地为指针p分配地址,这时会自动分配合理地址吗?会不会胡乱分配?可能我们多数时不这样使用指针,但是我必须把它搞明白。请指教。

#include "stdio.h"

void main() { int *p; *p=77; printf("%d\n",*p); }

以上程序到是能运行,但*P是指针变量,上面*p=77也是合理。原因就是如果你是*p=77而不是p=77就会能运行,指针加*可以当变量来使用可以附值。不加*就是指针附值只能对它的地址进行操作,不会对它的数值进行操作。

2004-08-06 09:19
yms123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:209
帖 子:12488
专家分:19042
注 册:2004-7-17
得分:0 
不过按程序规范写法来说,上面那么写很不规范但合理不会有问题。
2004-08-06 09:21
wubbin
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2004-8-6
得分:0 

非常感谢 ysm123 先生 / 小姐。

我总结您的指点:

1 【指针加*可以当变量来使用】既然当变量用,当然系统会分配合理的内存地址,而不会乱用内存空间。

2 上面程序虽合理,不会有问题,但按程序规范性来说,很不规范,一般不要这样用。

2004-08-06 09:33
wubbin
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2004-8-6
得分:0 

对不起,写错你的名字了。应该是 yms123 ,我写成 ysm123 了。

感谢您的解答。

2004-08-06 09:55
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
以下是引用wubbin在2004-08-06 09:12:50的发言:

以下程序从理论上是正确的还是错误的? 在TC++ 3.0 环境没有任何编译和连接的警告或错误,运行结果正确。

我想问的核心问题是:程序没有明确地为指针p分配地址,这时会自动分配合理地址吗?会不会胡乱分配?可能我们多数时不这样使用指针,但是我必须把它搞明白。请指教。

#include "stdio.h"

void main() { int *p; *p=77; printf("%d\n",*p); }

严重错误!

好好看看书!


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-08-06 10:29
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
得分:0 

我想上面的程序,是不会有问题的,因为在申请 int *p时已经给了地址了,这个地址肯定没有问题的是不是???

就象yms123 所说把它当变量用不会有问题吧???

但如果用*(p+n)=X;就有问题了,因为你不知道它里面原来存的什么数据,是不是

knocker???我现在又迷糊了!!!

[此贴子已经被作者于2004-08-06 10:47:28编辑过]


差点把你忘了...
2004-08-06 10:45
更深的蓝
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2004-8-4
得分:0 

很明显是错误的,看看书你就会发现,指针时不可以直接赋值的,至少也要加上个&符吧!~!~!~!


缘起缘灭,不过那一瞬间,今生和C有缘,一定要好好地珍惜。向着程序大师的目标,努力!~!~!~!~!
2004-08-06 11:03
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
以下是引用天使预备役在2004-08-06 10:45:49的发言:

我想上面的程序,是不会有问题的,因为在申请 int *p时已经给了地址了,这个地址肯定没有问题的是不是???

就象yms123 所说把它当变量用不会有问题吧???

但如果用*(p+n)=X;就有问题了,因为你不知道它里面原来存的什么数据,是不是

knocker???我现在又迷糊了!!!

#include "stdio.h"

void main() { int *p;//编译程序是会给p变量分配一个空间(一个地址),这个空间的指定你是干涉不了的,是编译程序的事。但是,p变量未经初始化其内容(即分配给p的地址中的数据)是随机

*p=77;//那么,这句是什么意思?是以p变量的内容(即分配给p的地址中的数据)为地址的空间进行赋值,你想想这会造成什么后果? printf("%d\n",*p); }


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-08-06 11:31
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
得分:0 

那初始化不也是对该地址进行写数据么???

你的意思是这个地址不能动????

那还怎么初始化????

我认为所谓的初始化(用数组,或动态申请)那只是对*(p+n)起作用的,他是先用数组把该部分的地址先占住,不被别的

变量占用,这样对*(p+n)写或读都不会引起别的副作用!!!


差点把你忘了...
2004-08-06 11:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-3936-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.340225 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved