c语言那些诡异

1:地址运算

int a[2];
printf(“%d—%d—%d”, &a[0], &a[1], &a[1]-&a[0]);

输出:1606416464—1606416468—1

解释:差值的确是4,但是同类型指针相减的计算法则是 :算数差值/类型长度,对比下面的代码可能就了解的更清晰一点了

int i = (int)(&a[0]);
int j = (int)(&a[1]);
printf(“%d—-%d—-%d\n”, i, j, j-i);

指针移动一位:

int i = 1;
int *p = &i+1;
printf(“%d—-%d\n”, &i, p);

输出:1606416460—-1606416464,

看完上面,这个也就好理解了:

int a[5];
int *p = &a + 1;
printf(“%d—-%d\n”, &a, p);

输出:1606416448—-1606416468

C语言union和struct的区别

union一般结构

union 联合名{

数据类型:成员名;

数据类型:成员名;

……

} 联合变量名1,联合变量名2;

struct一般结构

struct 结构名{

数据类型:成员名;

数据类型:成员名;

……

}结构变量名1,结构变量名2;

主要区别:
1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员; 而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的,一个struct变量的总长度等于所有成员长度之和,遵从字节对其原则; 在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在 , Union变量的长度等于最长的成员的长度

2. 对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了,所以,共同体变量中起作用的成员是最后一次存放的成员; 而对于struct的不同成员赋值是互不影响的。