免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dadaball
打印 上一主题 下一主题

[C] c语言的尴尬:取常量地址 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2004-08-27 12:33 |只看该作者

c语言的尴尬:取常量地址

还是没有人回答我的问题:
程序1
Void main()
{int *p,i;
i=100;
p=&
printf("%d\n",i);  /*想第一次输出100*/
printf("%p\n",p);
getch();               /*执行程序2,再按任意键*/
printf("%d\n",i);  /*通过程序2输出50*/
}

输出的却是FFDA  ...(这是地址么)

程序2
void main()
{int *p;
p=FFDA;
*p=50;
}

可程序1输出的还是100   : (

论坛徽章:
0
22 [报告]
发表于 2004-08-27 12:34 |只看该作者

c语言的尴尬:取常量地址

应该是
p=& i ;

上面没有显示出来

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
23 [报告]
发表于 2004-08-27 12:40 |只看该作者

c语言的尴尬:取常量地址

还是你在金山的那贴里的问题。两个程序,运行后就是两个进程,两个进程就有两套进程空间,每一套都是4G,都有自己的地址。

就好比说,沈阳有铁西区,铁岭也有铁西区。你告诉一个人你在铁西区,实际上你在沈阳,可是他在铁岭的铁西区找你,可能找到你吗?

要是想看地址和内容的关系。如果是在win下,可以用debug,深入调试你的程序,就可以看到了。或者用那帖子里面别人和你说的attch的方法。

论坛徽章:
0
24 [报告]
发表于 2004-08-27 17:31 |只看该作者

c语言的尴尬:取常量地址

谢谢,如何学进程?
C语言的指针能不能
分进程去指?

不行的话推荐本教材吧

论坛徽章:
0
25 [报告]
发表于 2004-08-28 18:55 |只看该作者

c语言的尴尬:取常量地址

据我所学,在C语言中,我的理解是:

数组a[5]这样的,a是数组的首地址,因为实际存储地址是暂时不能确定的,我们这个a的作用就是给这个首地址一个“名称”;编译器会在编译时将这个名称改成相应的地址。而char *p,这样的指针是一个变量,这个变量的作用是存储地址;p有他自己的存储地址&p,这才相当于数组名a这样的“层次”——同为常量;但它的内容p是另一个地址,这也是地址,但与a这样的地址不同,p是变量,a是常量;而p所指地址内容是*p,这*p与a[0]也是同一个层次;

而const在C语言中的意义不是常量,是“不可以修改”的“变量”,或者你也可以把它叫做“只读变量”。比如你编译后的程序写入ROM中,一些存储的数据在运行时只能读,不能写。这就是C语言中的const表达的意思。

C语言中没有定义常量的语法,常量只是用预处理的#define来实现,但预处理是文本替换,与定义常量是有区别的,“量”是有类型,而文本则没有类型的区别;所以#define不能帮忙查错。C++中的const是用来定义常量的,它就是用来代替C语言中#define的,使得有些类型匹配错误在编译时就能暴露出来。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
26 [报告]
发表于 2004-08-29 17:29 |只看该作者

c语言的尴尬:取常量地址

UNIX下两个进程的空间地址不同,
用户态下普通进程修改不了其他进程的空间内容,
除非你修改内核中断进入核心态,明白?
顺便问一下,你到底要作什么??

论坛徽章:
0
27 [报告]
发表于 2004-08-30 00:50 |只看该作者

c语言的尴尬:取常量地址

看来只好先学Unix/Linux了

论坛徽章:
0
28 [报告]
发表于 2004-09-04 07:24 |只看该作者

c语言的尴尬:取常量地址

[quote]原帖由 "flw"]语法规定了,对数组名称进行 & 运算是合法的,其结果就是数组的第一个元素的地址。 [/quote 发表:


你看看下面:
———————————————————————————————————
源程序:
#include <stdio.h>;

main()
{
  int i,a[] = {0, 1, 2, 3};

  for(i = 0; i < 4; i++)
    fprintf(stderr, "%d\t", *(a + i));
    //printf("%d\t", *(&a + i));

  printf("\n";

  printf("a = %d\ta + 1 = %d\t&a = %d\t&a + 1 = %d\n",\
          a, a + 1, &a, &a + 1);
  printf("a = %d\ta + 4 = %d\t&a = %d\t&a + 4 = %d\n",\
          a, a + 4, &a, &a + 4);
}
-----------------------------------------------------------------------------
运行结果:
0        1        2        3       
a = 2147483320        a + 1 = 2147483324        &a = 2147483320        &a + 1 = 2147483336
a = 2147483320        a + 4 = 2147483336        &a = 2147483320        &a + 4 = 2147483384
-----------------------------------------------------------------------------
我的结论:象flw所说的那样“a==&a”,没错!但是a和&a肯定是不同的,从上面的结果可以看出来。

[quote]原帖由 "yichun"]至于说 &sz 和 sz 仍是有差别的, 比较一下 sz + 1 和 &sz + 1 就可以知道. 将 sz 解释成数组首元素的地址可能是为了简洁的需要, 否则得用 &sz[0] 来表示. 而用 &sz 表示数组整体的首地址, 也是有必要的.[/quote 发表:


yichun老大说得好!

论坛徽章:
0
29 [报告]
发表于 2004-09-04 07:27 |只看该作者

c语言的尴尬:取常量地址

[quote]原帖由 "aero"]数值不占空间,常量占空间,变量占空间。地址是数值,指针是变量。[/quote 发表:


恕我无知,我不知道你能不能给数值下个定义?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
30 [报告]
发表于 2004-09-06 08:30 |只看该作者

c语言的尴尬:取常量地址

比如你在程序里面有一个表达式:2+2。那么编译后,它就是一个数值:4。它不会在程序中为这个“数值”申请一个空间去存放。同理,数组名,就是一个“数值”。它是一个值,并没有地址空间专门来存储这个值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP