| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 657 人关注过本帖
标题:求助,这个指针定义可以编译但不能运行
只看楼主 加入收藏
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:7 
求助,这个指针定义可以编译但不能运行
各位大虾好!

我是刚学的C,目前在看的书是C PRIMER,这两天刚看到数组与指针那一章。
但现在有一个最简单的步骤过不去。
程序代码:
int main(void)
{
    int * par;

    *par=5;
    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册
在VC++中可以编译,但不能运行,提示如图中所示的错误。

我明明已经定义了指针,为什么还是提示未定义?
2011-12-09 14:45
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
PS: 我将指针定义放在函数形式参量上,比如编译那个两个数字互换的程序,是可以正确运行的。
为什么这个不行?
2011-12-09 14:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
这个指针所指向的实体在哪,你说得出来吗?

授人以渔,不授人以鱼。
2011-12-09 14:52
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
我不是很懂你的话,但下面的程序是能正确运行的
程序代码:
void dayin(int * a,int n);

int main(void)
{
    int ar[3]={1,2,3};
   
    dayin(ar,3);
    return 0;
}

void dayin(int *a,int n)
{
    int i;

    for(i=0;i<n;i++)
        printf("%d ",*(a+i));
}

不过听你这样一说,我好像有点体会。
我之前有学过一段时间的Pascal,定义一个指针后要运行new(pointer)以产生一个动态变量。但是无论是否产生这个动态变量,pointer这个指针变量本身在定义的时候就已经存在了。
难道C中不一样,而且为什么在函数中定义的又可以运行(好像函数调用时已经赋了实参这个实体过去了)

如果是这个原因,主函数中又如何赋实体?
2011-12-09 15:01
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
程序代码:
int main(void)
{
    int *par;
   
    printf("%p",par);
    return 0;
}
我有点理解TonyDeng兄的意思了,没有指针所指向的实体不能赋值。

即使指针变量本身已经定义,但以上的程序还是打印不出来。
因为%p打印的的是指针变量上所存储的地址值,而不是指针变量本身的地址值。
是不是这个意思?
2011-12-09 15:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
int* par只是定义了一个指向int数据的指针,但那个int数据是否存在,却是不知道的。在你另外的那个程序中,ar数组实体已经存在,这时把ar的地址通过参数形式传入dayin()函数,成为指针a,那么a的指向很实在,就是实体ar数组的地址。然而在你1楼的代码中,仅仅是声明了指针而已,对象却不存在,故而给出编译警告。

记住:无论是指针还是引用,都必须要对象实体真实存在,一旦对象实体消失,指针和引用都是虚的,所谓野指针就是这样来的。


[ 本帖最后由 TonyDeng 于 2011-12-9 15:16 编辑 ]

授人以渔,不授人以鱼。
2011-12-09 15:14
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
一语点醒

感谢TonyDeng兄,已结帖,因小弟初来咋到没有什么分数,只能是意思一下了。
2011-12-09 15:15
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 5楼 yeliming
指针是一种保存变量地址的变量。
指针在内存里有自己的地址,而这个地址的内存上存放的是另一个变量的地址。int *p=&a; 变量p有自己的地址,而这个地址的内存存放的值是a的地址。
int main(void)
{
    int* par; //只定义了指针变量,但这个变量的值是未知,可能指向任意的内存地址   
    *par=5;//向那个非法的地址写值是会出现不可预知的后果
    return0;
}
指针很灵活,可以到任何内存地址,所以学的时候一定要吃透指针的几个关键词,指针的地址,指针的值,指针指向的变量的值

总有那身价贱的人给作业贴回复完整的代码
2011-12-09 15:31
快速回复:求助,这个指针定义可以编译但不能运行
数据加载中...
 
   



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

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