飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 8448|回复: 10

[C/C++] 求助:一个关于指针变量a的&a的运用

[复制链接]
  • TA的每日心情
    开心
    前天 12:41
  • 签到天数: 683 天

    [LV.9]以坛为家II

    发表于 2009-5-13 21:41:50 | 显示全部楼层 |阅读模式
    今天刚看了第六课的视频,有这么一个程序
    main()
    {
         void *a;
         a=(void *)malloc(4);
         scanf("%d %d",(int *)a,(int *)a+1);
         printf("%d",*((int *)a) + *((int *)a+1));
    }


    老大刚开始打成了(int *)&a
    a是开出的4个空间的首地址,而&a应该是指针变量a的地址,即&a这个地址里放的是4个空间的首地址,也就是说也可以用指针的4个字节的空间

    main()
    {
         void *a;
         a=(void *)malloc(4);
         scanf("%d %d",(int *)&a,(int *)&a+1);
         printf("%d",*((int *)&a) + *((int *)&a+1));
    }


    第二段代码是把两个输入存放在了指针变量的4个空间里了,而不是指针变量所指的动态开出来的4个空间里

    可对前面课程的一个程序
    #define H strlen(a)
    main()
    {
            char *a="ChinaPYG!";
            int  *b=0;
            for( ; *((char *)&b+1) < H ; (*((char *)&b+1))++)
             printf("%c",*(a + *((char *)&b+1)));
    }

    其中的&b同样应该是指针b的4个空间
    untitled.GIF
    这里假设段地址也为1000
    *((char *)&b+1)应该是2001里的内容 3(实际情况可能不同,但不一定是0)
    当是3时,输出的字符是从*(a+3)开始的

    可实际情况是程序输出正确,但我去掉所有的&时,总是从第2个字符开始输出,而我认理解为(char *)b才是0所在空间的第一个空间

    不知道我哪里理解错了,请老大和各位纠正一下!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-13 22:32:45 | 显示全部楼层
    我的看法是 *a本来就是被定义为指针的。
    main()
    {
         void *a;  //这里我的理解是 定义一个Void型的指针 *a
         a=(void *)malloc(4);  // 这里为a申请四个字节的空间
         scanf("%d %d",(int *)a,(int *)a+1); //前俩字节一组,后俩一组
         printf("%d",*((int *)a) + *((int *)a+1));// 后面的就是分别取内容打印之
    }

    附注:(int *) 说明后边的变量/空间 存放的数据类型是 指针型的 就是存的是地址

    [ 本帖最后由 kelvar 于 2009-5-13 23:26 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-13 23:06:25 | 显示全部楼层
    前边解释的是完全OK的 这个程序我没看懂问的是什么

    #define H strlen(a)
    main()
    {
            char *a="ChinaPYG!";
            int  *b=0;
            for( ; *((char *)&b+1) < H ; (*((char *)&b+1))++)
             printf("%c",*(a + *((char *)&b+1)));
    }

    int * b 本身在内存开辟了四个空间 我们用 &b 取这个空间的地址后 这四个字节就归我们处理了 (char *)&b 就表示 &b 这个地址指向的是一个字节的内存空间 (char *)&b+1 就是指向第二个char 型数据空间的地址 * 一下 就是该内存的数据了


    a是开出的4个空间的首地址,而&a应该是指针变量a的地址

    这个之所以 我讲 &a 修改为了 a  
    用&a 是将存储的数据放到了 a 这个变量里
    不用&的时候 是将变量存放到了我们动态开辟的空间里
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-12-18 12:34
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2009-5-13 23:31:49 | 显示全部楼层
    我也是菜鸟。冒昧回答下。感觉楼主的理解有些问题。
    一、
    int  *b=0;按楼主所画,2000,2001肯定为0(而不是你说的“不一定”)。
    *((char *)&b+1)代表地址2001对应的变量,初始值为0。

    二、但我去掉所有的&时,总是从第2个字符开始输出,
    去掉所有的&时,b=0,*((char *)b+1)就不成立了。内存会报错的。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 12:41
  • 签到天数: 683 天

    [LV.9]以坛为家II

     楼主| 发表于 2009-5-14 12:20:12 | 显示全部楼层
    我的理解是,
    int  *b=0;
    这句开了两处空间,一处是0所占的两个字节的空间,即1000和1001;
    另一处是指针b所占的四个字节的空间,即2000~2003;
    而指针b指向的是0所在的空间,即b里放的是0的地址;
    如果是这样的话,2002和2003为0所在空间的段地址,2000和2001为段内偏移地址,而0的地址不可能为00 00 00 00(H)吧
    在这样的情况下,同上楼说的一样,*((char *)&b+1)为2001的内容,但2001里是0的地址,怎么可能一定是00H呢?
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-14 14:27:47 | 显示全部楼层
    int  *b=0;
    这句开了两处空间,一处是0所占的两个字节的空间,即1000和1001;
    另一处是指针b所占的四个字节的空间,即2000~2003;

    这里错了 你这样来看 int b; b=0;就看明白了

    int  *b=0; 声明了一个变量 这个变量占四个空间 往这个变量的前两个字节赋值为0 (后两个字节为段地址 我们之后再讲)
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2017-9-24 22:49
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2009-5-14 15:41:03 | 显示全部楼层
    前面理解的没问题,后面的2000和2001地址里面肯定是0的(如果small模式的话),所以一定是0.
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 12:41
  • 签到天数: 683 天

    [LV.9]以坛为家II

     楼主| 发表于 2009-5-14 17:53:17 | 显示全部楼层
    明白了/:018
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-5-23 20:15:38 | 显示全部楼层
    多个指针 ,可以按 从里到外层层剥离
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-5-23 20:16:27 | 显示全部楼层
    变量 = 变量名 + 地址
    指针指向变量的地址,char型除外,,呵呵
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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