首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 看《c和指针》时发现了一个问题和大家共享 [已结贴,结贴人:zhaoym791010]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhaoym791010
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-24 08:19:12 楼主
        最近,有点空闲,于是捧起经典之作《c和指针》粗略的翻看,发现了一个问题和大家共享,是小问题一个,主要是想和初学者共同探讨,大侠们对这个已经司空见惯了,哈哈!
    第八章的练习题:
        int intr[10]={20,30,40,50,60,...}
      假定intr的地址值为100,且int类型变量和int类型指针都是占四个字节,请问&intr+4的值是多少?
      书后给的答案是116。
      其实这个答案有误。
    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xkyx_cn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-08-24 08:41:441楼 得分:0
    楼主认为答案是多少?
    难道是100+4*sizeof(intr) = 260??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chlaws
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:00:022楼 得分:0
    LZ应该是如此理解的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • icerhack
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:01:443楼 得分:0
    应该是116
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:22:204楼 得分:0
    我觉得是260
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fig_o
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:31:525楼 得分:1
    C/C++ code
    int main(int argc, char *argv[]) { int array[5]={0,1,2,3,4}; printf(" array is %X \n", array); //第一行 printf(" &array is %X \n", &array); //第二行 printf(" &array is %X \n", array+4);//第三行 printf(" plus 4 is %X \n",(&array)+4);//第四行 int array2[1]={0}; printf(" plus 4 is %X \n",(&array2)+4); [code=C/C++]
    system("PAUSE");
      return 0;
    }
    [/code]
    楼主可以看到第一行和第二行的数字一样,但意义却不相同
    第一行表示的是一个类型为int * 指针,而第二行表示的是
    一个类型为 int *[]的指针,所以第三行增加了4*sizeof(int)=16
    而第四行增加了4*sizeof(数组总长度)=4*5*4=80
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fig_o
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:32:516楼 得分:0
    C/C++ code
    int main(int argc, char *argv[]) { int array[5]={0,1,2,3,4}; printf(" array is %X \n", array); //第一行 printf(" &array is %X \n", &array); //第二行 printf(" &array is %X \n", array+4);//第三行 printf(" plus 4 is %X \n",(&array)+4);//第四行 int array2[1]={0}; printf(" plus 4 is %X \n",(&array2)+4); system("PAUSE"); return 0;

    代码重贴一遍
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guowei1651
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:38:537楼 得分:1
    呵呵  我说一句  在不同的硬件上是不同的存放顺序的  有从高到低的  也有从低到高的  你要看是什么样的系统
    也许还与os有关系  所以这个很不确定
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • waji2000
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:48:038楼 得分:0
    int intr[10]={20,30,40,50,60,...}
    假定intr的地址值为100,且int类型变量和int类型指针都是占四个字节,请问&intr+4的值是多少?
    书后给的答案是116。
    其实这个答案有误。

    没有问题吧.

    &intr  相当于  &intr[0]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • realdragon2
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:52:589楼 得分:0
    7楼说的有道理, 可能变量在内存中不是按顺序存放的,要考虑内存对齐的问题.
    我的试验结果如下(GCC)平台:

    int a[2]={1,2};
    printf("%p\n",&a);
    printf("%p\n",&a+2);

    结果如下:
    0xbfd3fca4
    0xbfd3fcb4
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • realdragon2
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:55:4810楼 得分:1
    对数组名取地址运算和对数组第一个元素取地址运算是不同的.
    引用 8 楼 waji2000 的回复:
    int intr[10]={20,30,40,50,60,...}
    假定intr的地址值为100,且int类型变量和int类型指针都是占四个字节,请问&intr+4的值是多少?
    书后给的答案是116。
    其实这个答案有误。

    没有问题吧.

    &intr  相当于  &intr[0]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • realdragon2
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 10:01:5311楼 得分:0
    输出格式控制符不对, 重新测试如下:

    int a[2]={1,2};
    printf("%u\n",&a);
    printf("%u\n",&a+3);

    输出结果如下:

    3215491556
    3215491580


    引用 9 楼 realdragon2 的回复:
    7楼说的有道理, 可能变量在内存中不是按顺序存放的,要考虑内存对齐的问题.
    我的试验结果如下(GCC)平台:

    int a[2]={1,2};
    printf("%p\n",&a);
    printf("%p\n",&a+2);

    结果如下:
    0xbfd3fca4
    0xbfd3fcb4
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • BMCRNET
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 10:51:1412楼 得分:2
    在Windows 上楼主的理解是对的
    其它平台我没有测试!

    DevC++测试代码如下:
    C/C++ code
    #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int intr[10]={20,30,40,50,60,70,80,90,100,110}; int *p = intr; printf("the address intr = %X\n",intr); printf("the address &intr = %X\n",&intr); printf("the address intr+4 = %X\n",intr+4); printf("the address &intr+4 = %X\n",&intr+4); printf("the value intr[0] = %d\n",*p); p = intr+4; printf("the value intr+4==intr[4] = %d\n",*p); p = &intr+4; printf("the value &intr+4==intr[0]+4*10(数组长度)*4(元素类型宽度) = %d\n",*p); //输出的答案不确定,因为已经越界了 p = (&intr+4); printf("the value &intr+4==intr[-31] = %d\n",p[-31]); //输出intr[9] 的值 system("PAUSE"); return 0; } /* 输出: the address intr = 22FF40 the address &intr = 22FF40 the address intr+4 = 22FF50 the address &intr+4 = 22FFE0 the value intr[0] = 20 the value intr+4==intr[4] = 60 the value &intr+4==intr[0]+4*10(数组长度)*4(元素类型宽度) = -1 the value intr+9==intr[9] = 110 请按任意键继续. . . */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • phz1985
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 11:00:3913楼 得分:0
    经VC测试,结果为260.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qmm161
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 11:03:3014楼 得分:1
    lz 很细心,赞一个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • HelloDan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 11:34:1215楼 得分:0
    C/C++ code
    #include<stdio.h> int main() { int intr[10]={20,30,40,50,60,70,80,90,100,110}; printf("%x\n",&intr); printf("%x\n",&intr+1); printf("%x\n",&intr+4); return 0; } 22ff40 22ff68 22ffe0 Terminated with return code 0 Press any key to continue ...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • freedomyueye
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 11:52:5316楼 得分:0
    &intr+4
    对intr 做& 操作时, 已经把 intr 的数组信息包含进去了!

    intr        20  30  40  50
    &intr + 1    20  30  40  50
    &intr + 2    20  30  40  50

    C/C++ code
    int main(int argc, char *argv[]) { int array[5]={0,1,2,3,4}; int (*p)[5]; p= &array; return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guolisen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 12:09:0717楼 得分:2
    引用 8 楼 waji2000 的回复:
    int intr[10]={20,30,40,50,60,...}
    假定intr的地址值为100,且int类型变量和int类型指针都是占四个字节,请问&intr+4的值是多少?
    书后给的答案是116。
    其实这个答案有误。

    没有问题吧.

    &intr  相当于  &intr[0]


    不对
    &intr 为指针的指针
    &intr[0]为intr
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guolisen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 12:19:2718楼 得分:0
    &intr = intr[0][10]
    &intr+4 =  intr[4][10] = 100+4*sizeof(intr) = 260
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ethan119
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 19:38:0719楼 得分:1
    &intr+4

    intr+4
    是有区别地
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • touta
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 21:11:1020楼 得分:0
    这个
    "变量+即时数"
    的格式
    地址或内容做的改变该是根据变量的类型决定吧

    指针是4byte
    哪么4*即时数即为增加的byte
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • suxpert
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 21:19:5521楼 得分:0
    11楼: ANSI对指针值的输出格式规定为%p,所以9楼的代码是符合ISO标准的,

    而您的是强制把指针看作整形,这不是好的编程习惯,呵呵。

    lz 的问题很经典, ansi对指针的规定只是对于“具有确定数据类型”的指针在与整数加减时的行为作出规定,

    而对于无法确定数据类型的指针值(或者不如说地址)与整数加减的行为没有规定,所谓“未定义的”。

    一般像&intr[0]这样的地址,都是作为常量看待的,所以lz似乎恰好遇到了“未定义”的情况。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbh2001
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 08:38:3522楼 得分:0
    若声明为
    int intr[10]={20,30,40,50,60};


    intr是列指针,intr+1中的1表示一个单位为sizeof(int)32位下为4
    intr是行指针,&intr+1中的1表示一个单位为sizeof(intr) 32位下为4*sizeof(int)即40

    所以,&intr+1位100+4*40=260
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gavin04_1
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 08:43:4423楼 得分:0
    引用 14 楼 qmm161 的回复:
    lz 很细心,赞一个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gavin04_1
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 08:44:2124楼 得分:0
    引用 14 楼 qmm161 的回复:
    lz 很细心,赞一个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhaoym791010
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 19:26:1225楼 得分:0
    大家在一起讨论,共同进步,真好!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天