目录
1.代码
int main(void) {
int a[5] = {1, 2, 3, 4, 5};
int *ptr = (int *)(&a + 1);
printf("%d %d", *(a + 1), *(ptr - 1));
return 0;
}
2.解析
数组名本质上其实就是首元素的地址
如果取地址数组名,所以int* ptr=(&a+1)就是整个数组的地址+1就是p跳过整个数组
因为a是一个整型的数组,所以*(a+1)从首元素开始跳过4个字节正好跳到第二个元素 2
ptr使用整型指针存放的a的地址,所以一次也是跳过一个字节,*(prt-1)就是往前跳四个字节正好回到了a数组的第五个元素5
所以最后的结果就是2和5
1.2 代码2
int main() {
int i, j, k, a = 3, b = 2;
i = (--a == b++) ? --a : ++b;
j = a++;
k = b;
printf("i=%d,j=%d,k=%d\n", i, j, k);
return 0;
}
2.2解析(题二)
首先一个条件表达式
--a先减减后使用 a=2
b++先使用后加加 b=2
a==b
然后b=3
i=--a 等于1
j=a++先加后使用 j=1,a=2
k=b,b=3,k=3
所以最后的结果是 i=1 j=1 k=3
代码三
#include <stdio.h>
main(){
int a = 2, c = 5;
printf("a=%%d,b=%%d\n", a, c);
}
解析三
在c语言中每两个%%会被当成一个%(字符)直接输出,由于d没有了格式控制符,所以也被当做了一个普通字符
(如果两个%配成一对的话就合成一个普通字符失去了可是控制符的功能)
代码四
scanf("a=%f,b=%d", &a, &b);
解析四
在输入数据的时候,引号里面的内容必须全部输入
代码五
struct {
short a;
char b;
float c;
}cs;
解析(题五)
short是2字节
char是1字节
float是4字节
过程:
首先short占了2字节,然后轮到char,他只占1但是由于已经有了short的2字节所以整个结构体需要是2字节的倍数,因此char占了1字节之后对齐补上1字节。最后轮到float,4字节,是2的倍数所以不用补。
现在整个结构体就是2+(1+1)+4=8,结构体的大小需要是最长元素的倍数,也就是4的倍数,很显然满足,所以最终答案就是8。