鱼C论坛

 找回密码
 立即注册
查看: 1153|回复: 13

为什么会是这样

[复制链接]
发表于 2014-11-4 14:34:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{
   const int* i = 6;
   i++;
   printf("为什么等于这个数%d\n",i);
   getchar();
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-5 08:22:18 | 显示全部楼层
据我所知,这个程序应该运行不起来的,你给一个指针赋值为不为0的数这是要搞哪样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-5 08:47:03 | 显示全部楼层
你给指针赋一个常量值想干什么????
指针是什么?????
lz再看看书吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-5 16:24:47 | 显示全部楼层
const int* i = 6;不能讲一个整型常量赋值给一个整型指针
只能写成int* i=(int *)6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-5 21:57:47 | 显示全部楼层
试试呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-6 13:45:54 | 显示全部楼层
我就路过看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-7 00:19:55 | 显示全部楼层
fireofsun 发表于 2014-11-5 08:22
据我所知,这个程序应该运行不起来的,你给一个指针赋值为不为0的数这是要搞哪样

我只是改变一下const的值,我已经明白他为什么输出10了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-7 00:20:56 | 显示全部楼层
qzh130 发表于 2014-11-5 08:47
你给指针赋一个常量值想干什么????
指针是什么?????
lz再看看书吧。

我只是做一个试验,改变const的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-7 00:22:21 | 显示全部楼层
calton007 发表于 2014-11-5 16:24
const int* i = 6;不能讲一个整型常量赋值给一个整型指针
只能写成int* i=(int *)6

这只是一个试验,const是一个声明只读变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-7 00:23:39 | 显示全部楼层
#include <stdio.h>

int main()
{
   const int* i = 6;
   i++;
   printf("为什么等于这个数%d\n",i);
   getchar();
}

为什么等于10  int = 4 + 6;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-7 08:56:43 | 显示全部楼层
涉及优先级问题吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-7 19:42:08 | 显示全部楼层
1980469235 发表于 2014-11-7 00:19
我只是改变一下const的值,我已经明白他为什么输出10了

常量按理说赋予的初始值是不允许改变的吧……?C++和java至少是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-7 22:23:04 | 显示全部楼层
我把前三句汇编了下
第一句:        const int* i = 6;
00401028   mov         dword ptr [ebp-4],6                // 指针i = 6
第二句:        i++;
0040102F   mov         eax,dword ptr [ebp-4]                // eax = i = 6
00401032   add         eax,4                                        // eax = eax + 4 = 10
00401035   mov         dword ptr [ebp-4],eax                // 指针i = eax = 10
第三句:        printf("为什么等于这个数%d\n",i);
00401038   mov         ecx,dword ptr [ebp-4]                // eax = 10
0040103B   push        ecx                                        // 参数i
0040103C   push        offset string "\xce\xaa\xca\xb2\xc3\xb4\xb5\xc8\xd3\xda\xd5\xe2\xb8\xf6\xca\xfd%d\n" (00        // 参数"为什么等于这个数%d\n"
00401041   call        printf (00401400)                        // 调用printf(输出的值为10)

也就是说虽然i是一个指针,但是它同时也是一个变量(和int、char等等相同),
第一句将i赋值为6,
第二句i++,因为指针变量i的类型为int(一般大小为4个字节,是情况而定),指针变量加1相当于+1 * sizeof(指针类型),所以最后i的值为6 + 4 = 10
第三句输出指针i本身的值,所以输出10,但是如果是*i则表示输出在内存i处(内存地址10处)的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-13 15:28:43 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 07:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表