11.23

文章讲述了C语言中使用宏定义的技巧、内存对齐的重要性,以及如何避免头文件重复包含影响性能。还涉及位段操作、数组名指针、联合体的使用,小端和大端存储的区别,以及枚举类型、异或运算在查找特定模式中的应用。另外,还提到了文件操作如fopen的可能失败和输入流的作用,以及sscanf和sprintf的格式化转换功能。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值