C语言小记1

今天学习C语言发现了以前的一些知识上的盲点,就记录下来。

printf("%d,%d\n", sizeof('A'), sizeof("A"));

这个代码打印的结果是 4,2

我去查了下资料这个'A'是integer character constant类型,其实就是我们自己所获得的ascii码。在三十二位的windows系统里int是4个字节所以打印的4,这里这个当成了int类型。

2是因为双引号会认为是字符串,所以在其后系统自动添加了'\0',所以其实是两个字符。

 

typedef struct strtype3 {
    char a;
    int b;
} X3;
X3 a = { 1 ,'A' };
printf("%d\n", &a);
printf("%d,%d\n", &a.a, &a.b);
//打印结果
14810844
14810844,14810848

这里可以看出属性a和属性b是相差了4个字节,但是a是char类型的明明是一个字节。

原来c语言有一个边界对齐的特点,就是这个属性的地址必须是4的倍数。所以这样就会有三个字节的地址空缺出来。

但是连续两个char类型的属性,这样就会有两个字节的地址空缺出来。

所以c语言结构体的属性最好可以合理安排,这样可以节省很多内存出来。

这里其实就是字节对齐,一旦我们知道了这个东西,那岂不是就意味着我们可以通过指针来调用结构体里面的东西呢?

于是我就试了一下。

struct STRTEST {
    int num1;
    char ch;
    int num2;
};
 

void main()
{
    struct STRTEST str = { 11,'A',22 };
    struct STRTEST *p = &str;
    printf("%d\n", p);
    printf("%d\n", *(int *)p);//这里指针类型要转换下
    p = (int)p + sizeof(int);
    printf("%c\n", *(char *)p);
    p = (int)p + sizeof(int);
    printf("%d\n", *(int *)p);



    system("pause");
}
5242052
11
A
22
请按任意键继续. . .

真好玩!

转载于:https://www.cnblogs.com/ZhanKing/p/10253330.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值