1.
#define M 100
#include<stdio.h>
int main()
{
printf("%d", M);
#undef M
printf("%d", M);
//第二个printf没有结果
}
2.通过宏定义来实现有选择的执行语句
和if else一个尿性
3.防止头文件被多次包含,导致预处理和编译的速度下降,内存占用增多
4.引用头文件的方式
5.
题目讲解
1.内存对齐
这里错了,是最对齐数的整数倍
2.
位段开辟空间时,一个字节一个字节的开辟,然后按照你的规定去占用,不够了在开辟下一个字节
这个结构体大小总共3个字节
3.
puc是数组名,表示unsigned char类型的指针,指向数组首元素
强制转换成struct tagPIM类型的指针,那么就会按照他的类型来读
意味着只操作两个字节
同时按照位段的操作方式来操作
4.
首先,这是联合体,大小为两个字节
其次,s-> 与 (*s). 等价,意思是给a赋值
此时联合体的两个字节中为
依照小端存储,得到其在内存中的存储形式为3839
5.
大小端存储:
地址有高低地址之分,你的变量的字节也有高位地位之分,
小端就是低地址放低位,高地址放高位,大端则相反
6.枚举类型
默认初始化值、创建类型变量、
7.
8.有点难注意了
异或^具有传递性
1^2^3 == 1^3^2
思路:
先将整个数组滚动异或^,得到ret(异或具有传递性)
然后ret不断>>pos,pos++,并与1 按位与&得到ret的二进制中最靠右的1位
以第pos位是否为1将数组分成两组
再次滚动异或得到的结果就是“单身狗”(因为其他相同的数字异或时得到的是0,0与任何数异或都是该数本身)
void find(int* arr, int sz, int* d1, int* d2)//接收传参,用的是int*
{
int ret = 0;
int i = 0;
for (i = 0; i < sz; i++)
{
ret ^= arr[i];
}
int pos = 0;
for (pos = 0; pos < 32; pos++)
{
if ((ret >> pos) & 1 == 1)
{
break;
}
}
for (i = 0; i < sz; i++)
{
if (((arr[i] >> pos) & 1) == 1)
{
*d1 ^= arr[i];
}
else
{
*d2 ^= arr[i];
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
int sz = sizeof(arr)/sizeof(arr[0]);//sz代表的是元素个数,sizeof求出来的是总的字节数,需要sizeof/单个元素大小
int dog1 = 0, dog2 = 0;
find(arr, sz, &dog1, &dog2);
printf("%d %d\n", dog1, dog2);
return 0;
}
9.
fopen可能返回失败
10.
文件可以不加后缀
11.
所有输入流,输出流
标准输入输出流(stdin,stdout)
的意义是不同的
12.sscanf与sprintf实现格式化数据与字符串的转换
13.~2的意思是取反码
14
15.二维数组创建时给没有初始化的元素初始化成0