免费注册 查看新帖 |

Chinaunix

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

[C] 考试题C语言.请教. [复制链接]

论坛徽章:
0
31 [报告]
发表于 2005-11-04 10:23 |只看该作者
i = ps - (ps->a);
ps:指针类型
ps->a:整型
他们相减是什么意思啊 ???

同样的道理也在2楼的答案中不能理解?

论坛徽章:
0
32 [报告]
发表于 2005-11-04 10:36 |只看该作者
原帖由 黑苦咖啡 于 2005-11-4 10:23 发表
i = ps - (ps->a);

感觉楼主这句好象有问题,请指教.

论坛徽章:
0
33 [报告]
发表于 2005-11-04 10:46 |只看该作者
是啊,我也是从楼主那里 COPY 过来的,看来大家都在讨论2楼的算法而忘了关注楼主的程序阿。

论坛徽章:
0
34 [报告]
发表于 2005-11-04 10:55 |只看该作者
虽然刚来这个论坛
但学会了很多知识
尤其是指针偏移量:)

mq110 说的很好
C语言的精髓.在内核代码中充分的体现了.

侯捷大师也说过:源码面前 了无语言

[ 本帖最后由 karl412 于 2005-11-4 11:04 编辑 ]

论坛徽章:
0
35 [报告]
发表于 2005-11-04 11:47 |只看该作者

不好意思.

我是楼主.
我的答案是考试时写的.时间很紧,很多细节都错了.
i = ps - (ps->a); 本意是想求出指向结构s的指针和指向成员a的指针的距离.应该是i= (void *)ps-(void *)&(ps->a), duim


谢谢大家关心.

再次向zalem 致敬.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
36 [报告]
发表于 2005-11-04 11:50 |只看该作者
原帖由 lc1999 于 2005-11-4 11:47 发表
我是楼主.
我的答案是考试时写的.时间很紧,很多细节都错了.
i = ps - (ps->a); 本意是想求出指向结构s的指针和指向成员a的指针的距离.应该是i= (void *)ps-(void *)&(ps->a), duim


谢谢大家关心 ...


还是用char *吧.

论坛徽章:
0
37 [报告]
发表于 2005-11-04 13:12 |只看该作者
老大 能不能给一个这个函数的应用给我看看

论坛徽章:
0
38 [报告]
发表于 2005-11-04 13:19 |只看该作者
#include<stdio.h>

struct struct_s
{
        int a;
};

int main(void)
{
        struct struct_s test[3];
        test[0].a = 4;
        test[1].a = 5;
        test[2].a = 6;

        int num = 3;
        int *aptr = &num;
        struct struct_s *pointer;

        printf("the number is:%d\n",(char*)aptr);
        printf("the number is:%d\n",(int)(&test[0].a));
        printf("the number is:%d\n",(int)(&test[1].a));
        printf("the number is:%d\n",(int)(&test[2].a));
        printf("the number is:%d\n",(int)(&((struct struct_s*)0)->a));
        printf("the number is:%d\n",((char*)aptr-(int)(&test[0].a)));
        printf("the number is:%d\n",((char*)aptr-(int)(&test[1].a)));
        printf("the number is:%d\n",((char*)aptr-(int)(&test[2].a)));
        printf("the number is:%d\n",((char*)aptr-(int)(&((struct struct_s*)0)->a)));

        pointer = (struct struct_s*) ((char*)aptr - (int)(&((struct struct_s*)0)->a));

        printf("the pointer address is:%d\n",(int)&pointer);
        printf("the number is:%d\n",pointer->a);
        return 0;       
}

我用这个程序查看打印的地址值
结果发现        printf("the number is:%d\n",(int)(&((struct struct_s*)0)->a));
这句打印的整数值就是等于0!
如果是值是0,那为什么还要多写(int)(&((struct struct_s*)0)->a这句呢?

很想看看这个函数的应用啊!!!!
达人们,如果你有空请给我个例子让我看看

论坛徽章:
0
39 [报告]
发表于 2005-11-04 13:35 |只看该作者
二楼的大哥程序在Borland C++ Builder 6编译不成功.下面代码可成功:
#include <string>
#include <iostream>
using namespace std;

struct S
{
    int A;
    int a;
};
typedef struct S S;

S* get_s_ptr(int *a_ptr)
{
    int nOffset = offsetof(S, a);
    printf("a偏移量:%d\n", nOffset);
    printf("a_ptr地址:%X\n", a_ptr);

    S *ps = (S*)((int)a_ptr - nOffset);
    printf("ps地址:%X\n", a_ptr);

    return (ps);
}

void main(void)
{
    S s;

    printf("s地址=%X\n", &s);
    printf("s.a地址=%X\n", &s.a);

    S *ps = get_s_ptr(&s.a);
    printf("ps地址=%X\n", ps);

    return;
}

论坛徽章:
0
40 [报告]
发表于 2005-11-04 13:44 |只看该作者
原帖由 virmin 于 2005-11-3 16:57 发表
给定一个结构体内某个成员变量的地址,求这个结构体变量的地址
int i = (int)&((struct s*)0->a), 是a变量在结构体内的偏移量,这里巧用了0,0作为结构体首地址,直接得到偏移量,将a_ptr - i就得到了结构 ...


因为我的结构体
struct struct_s
{
     int a;       
};
定义成这样 所以偏移量为0 当我把结构体改为
struct struct_s
{
        int fronter;
        int a;
        int back;
};
就看到偏移量为4了 谢谢virmin 我开始看的时候太着迷于达人讲的眼睛与头顶的故事了
没有仔细看
(我就不删除上面我发的那个回复了 虽然比较傻 后来人就当我作个试验给你们看吧)


==========
还有一个问题
==========
printf("the number is:%d\n",((char*)aptr-(int)(&((struct struct_s*)0)->a)));

pointer = (struct struct_s*) ((char*)aptr - (int)(&((struct struct_s*)0)->a));

printf("the pointer address is:%d\n",(int)&pointer);

结果发现两者打印的值不一样
一个是1245008 一个是1245012
间隔一个sizeof(int)=4bytes的内存
只是把它强制转化为struct类型
指针指向的地址应该是一样的啊
为什么就不同呢?

[ 本帖最后由 karl412 于 2005-11-4 13:53 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP