免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6512 | 回复: 18
打印 上一主题 下一主题

[C] 刘峰六的C语言讲解-- C指针(1)  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-29 23:53 |只看该作者 |倒序浏览
本帖最后由 sohu2000000 于 2010-10-07 19:22 编辑

请给出下面程序的运行结果___
  1. /* env: 32 bits*/  
  2. int   
  3. main(void)   
  4. {   
  5.   long *p=0x100;   
  6.   p=p+sizeof(long);   
  7.   printf("%x\n",p);   
  8.   
  9.   return 0;   
  10. }  
复制代码
正确答案:  110

解析:

本题考察三个知识点:

1. 存储类型

2. 指针运算

3. printf格式化输出

我们来分析一下。

1 存储类型

   基于题目给出了32bit运行环境的概念,根据C99对于编译器是如何在内存中识别数据类型和读取的协议规范可知:

   sizeof(char)=1;

   sizeof(short)=2;

   sizeof(int)=4;

   sizeof(long)=4;

   sizeof(float)=4;

   sizeof(double)=8;

   

   所以,程序中 p=p+sizeof(long); 就转化成为 p=p+4;

2 指针的运算

   一般int类型算数int i =2 i=i+4 那么 i=6正确;

   但是指针真的运算有着其不同的含义,按照我个人的理解,解释如下

   ptr=ptr+m 的意义是 ptr沿着内存先前移动,移动了m个单位的距离, 单位的距离取决于ptr所指向的数据的内存存储空间的大小

   这里 p 指向long, 所以 p=p+4, 并不是 p=0x100+4;而是 p = 0x100+4*4 = 0x100+16;

3.printf的格式化输出

   printf的格式是%x,说明输出的内容是结果的十六进制模式,需要小心应答

   我们平时说的类型存储,sizeof()等等都是针对十进制而言

   所以上面提到的16,并不是内存看到的指令,

   16 = 0x10;

   p=0x100+0x10=0x110

   至此得到正确答案

综上所述,争取答案是110

刘峰六于 2010-08-22 23:38:56



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/08/29/5848553.aspx

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
2 [报告]
发表于 2010-08-30 00:01 |只看该作者
争取答案是110。

论坛徽章:
0
3 [报告]
发表于 2010-08-30 01:26 |只看该作者
回复 2# tempname2


   
争取答案是110。
tempname2 发表于 2010-08-30 00:01


    什么意思?木有看明白 {:3_198:}

论坛徽章:
0
4 [报告]
发表于 2010-08-30 09:21 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2010-08-30 11:51 |只看该作者
马勒戈壁,这帖子水了。

论坛徽章:
0
6 [报告]
发表于 2010-08-30 11:56 |只看该作者
为什么代码写两遍??????、、

论坛徽章:
0
7 [报告]
发表于 2010-08-30 11:57 |只看该作者
在VC6.0上编译:
--------------------Configuration: Console1 - Win32 Debug--------------------
Compiling...
main.cpp
f:\个人重要资料(勿删)\administrator\my documents\myproj\vc\console1\main.cpp(5) : error C2440: 'initializing' : cannot convert from 'const int' to 'long *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

Console1.exe - 1 error(s), 0 warning(s)

论坛徽章:
0
8 [报告]
发表于 2010-08-30 12:01 |只看该作者
在VC2010上
1>------ Build started: Project: Hello, Configuration: Debug Win32 ------
1>  Hello.cpp
1>f:\个人重要资料(勿删)\administrator\my documents\visual studio 2010\projects\hello\hello\hello.cpp(5): error C2440: 'initializing' : cannot convert from 'int' to 'long *'
1>          Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
9 [报告]
发表于 2010-08-30 14:16 |只看该作者
这帖是怎么回事?难道是我小白了没守规矩?

论坛徽章:
0
10 [报告]
发表于 2010-10-07 06:17 |只看该作者
sohu2000000 2010-10-06 16:52  

管理员, 状态, 帖子, 帮忙
帖子的地址是:http://bbs.chinaunix.net/thread-1775915-1-1.html


请CU管理员帮忙吧我的帖子重新置于正常状态,这个帖子没有问题,多谢了!

下面是关于同学们没有编译通过的原因的解答:

兄弟,你的VC设定一下需要,这个问题主要是由编译器引起的,因为VC使用的是C++编译器而不是C编译器,建议你在建立工程的时候选择建立C代码工程,就可以编译通过了 :)

我用CODEBLOCK和GCC

编译过程:
Checking for existence: D:\workspace\IDE\CodeBlocks\Projs\MyTestProj\bin\Debug\MyTestProj.exe
Executing: "D:\ProgramFiles\Dev\CodeBlocks/cb_console_runner.exe" "D:\workspace\IDE\CodeBlocks\Projs\MyTestProj\bin\Debug\MyTestProj.exe"  (in D:\workspace\IDE\CodeBlocks\Projs\MyTestProj\.)

运行结果:
110

Process returned 0 (0x0)   execution time : 0.313 s
Press any key to continue.


在试试看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP