免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 2005-11-03 13:11 |显示全部楼层
做一个记号 我也没有看懂

论坛徽章:
0
2 [报告]
发表于 2005-11-04 10:55 |显示全部楼层
虽然刚来这个论坛
但学会了很多知识
尤其是指针偏移量:)

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

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

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

论坛徽章:
0
3 [报告]
发表于 2005-11-04 13:12 |显示全部楼层
老大 能不能给一个这个函数的应用给我看看

论坛徽章:
0
4 [报告]
发表于 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
5 [报告]
发表于 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 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2005-11-04 14:04 |显示全部楼层
将身体结构改为
struct body_struct
{
        int head;
        int a;
        int nose;
};

就看到区别 恢复正常了啊 HOHO~~
要跟你好好学习! 你的故事讲的很好! 不然我眼睛也不会找到头上去呢

至于后面那个问题 虽然不是同一个东西(一个是指针 一个是结构体)
但是地址应该是一样的啊
不明白
直接告诉我吧)

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

论坛徽章:
0
7 [报告]
发表于 2005-11-04 14:22 |显示全部楼层
printf("the pointer address is:%d\n",(int)&pointer);
应该写为
printf("the pointer address is:%d\n",(int)pointer);

很幼稚的错误啊


以后继续努力吧

谢谢 雨丝风片 !!!  以后有问题请教你哈 ) 我会给你论坛短消息的

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

论坛徽章:
0
8 [报告]
发表于 2005-11-04 16:22 |显示全部楼层
kernel就是linux kernel代码啊)

http://www.kernel.org/pub/linux/kernel/
你自己去下载 慢慢看

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP