找回密码
 注册
搜索
查看: 685|回复: 6

C编程问题请教!

[复制链接]
发表于 2009-12-23 10:20:53 | 显示全部楼层 |阅读模式
前几天去面试,碰到一个题目,大致如下:
#include <stdio.h>
struct
{
        char a[4];
        long b;
}*p;
int main()
{
        int i,j,k,t;
        p = 0;
        i = p+1;
        j = (char *)p+1;
        k = (long *)p+1;
        t = (long)p+1;
        printf("%d,%d,%d,%d",i,j,k,t);
}
printf是我自己加上的,是想看一下运行结果,想请教一下,结果是如何得出的?还请各位不吝赐教。
发表于 2009-12-23 16:58:15 | 显示全部楼层
#include <stdio.h>
struct
{
char a[4];
long b;
}*p;
int main()
{
int i,j,k,t;
p = 0;//指针p指向0
i = p+1;//i等于 指针p加上一个p指针类型后所指向的地址,即0+8=8
j = (char *)p+1; 同上,不过这里p的类型被强制转换为(char *),所以是0+1
k = (long *)p+1;同上,p的类型被强制转换为(long *) ,long等于cpu字长,在32位机上k=0+4
t = (long)p+1; p所指向的地址被强制转换为一个long,t=0+1
printf("%d,%d,%d,%d\n",i,j,k,t);
}


指针的++ --跟指针类型相关
不过刚看开头还以为是考结构体对齐呢
点评回复

使用道具 举报

发表于 2009-12-23 18:54:00 | 显示全部楼层
向大家学习[em12]
点评回复

使用道具 举报

 楼主| 发表于 2009-12-23 20:09:07 | 显示全部楼层
非常感谢2楼!!!
点评回复

使用道具 举报

 楼主| 发表于 2009-12-23 20:44:56 | 显示全部楼层
还想请问2楼,i和t的区别在哪呢?为什么一个是加上一个p指针类型后所指向的地址8,而另一个所指向的地址被强制转换为long后,所加的只是1呢?
点评回复

使用道具 举报

发表于 2009-12-24 00:34:48 | 显示全部楼层
i中的p+1是p指针加上一个struct的偏移,所以i的值是0+8
而t中p被强制转换成long型的0,而0+1就是t的值
点评回复

使用道具 举报

发表于 2009-12-24 12:27:35 | 显示全部楼层
学习了……
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-26 09:38 , Processed in 0.044814 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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