今天学习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 请按任意键继续. . .
真好玩!