int a = 3; voidtest() { int a = 1; a += 1; { int a = a + 1; printf("a = %d\n", a); } printf("a = %d\n", a); } intmain(void) { test(); printf("a= %d\n", a); }
a = 32768 a = 2 a = 3
因为在 int a = a + 1在作用域中, a 是未初始化的,==可能会导致随机值被打印==,出了作用域,a被销毁(生命结束);a += 1,a = 2,函数外面打印2,main函数里没有定义a,所以用全局变量,即为3;
4. 内存对不齐
union与struct各有什么特点呢,你了解他们的内存分配模式吗。
typedefunion { long l; int i[5]; char c; } UNION; typedefstruct { int like;//4字节 UNION coin;//24字节,但要从8的倍数开始对齐,即第八个开始。 double collect;//8字节,刚好从32开始对齐。 } STRUCT; intmain(void) { printf("sizeof (UNION) = %zu\n", sizeof(UNION)); printf("sizeof (STRUCT) = %zu\n", sizeof(STRUCT)); }
sizeof (UNION) = 24 sizeof (STRUCT) = 40
union 共用一段内存空间,内存大小就是最大成员的大小,但必须按照最大对齐数的整数倍来安排内存。long在这里为8,i为20,c 为1,最大为20,但要为8的倍数,所以是24;
结构体大小为所有成员之和,且要有对齐数,所以为40;
5. Bitwise
请使用纸笔推导出程序的输出结果。
请谈谈你对位运算的理解。
intmain(void) { unsignedchar a = 4 | 7;//0100和0111 -> 0111 a <<= 3;//0111000 -> 56 unsignedchar b = 5 & 7;//0101和0111 -> 0101 b >>= 3;//0000000 -> 0 unsignedchar c = 6 ^ 7;//0110和0111 -> 0001 c = ~c;//00000001 -> 11111110 -> -2 -> 254 unsignedshort d = (a ^ c) << 3;//11000110000 -> 1584 -> (char)48 signedchar e = -63;//11000001 e <<= 2;//1100000100 -> 772 -> 4 -> 0x4 printf("a: %d, b: %d, c: %d, d: %d\n", a, b, c, (char)d); printf("e: %#x\n", e);//%#x是一个格式说明符,用于printf函数来输出整数值的十六进制,并确保输出的十六进制数前面带有0x前缀。 }
int* arr[10]; int (*a)[10]; int (*p[3])(int); 下来给个代码例子
// 被指向的函数 intadd(int a, int b) { return a + b; } intmultiply(int a, int b) { return a * b; } intsubtract(int a, int b) { return a - b; } intmain() { // 创建一个指向函数的指针数组// 定义函数类型 int (*a[3])(int, int) = { add, multiply, subtract }; return0; }
voidquicksort(int arr[], int left, int right) { if (left > right) return; int i = left, j = right; int temp = arr[i]; while (i != j) { while (i < j && arr[j] >= temp) { j--; } while (i < j && arr[i] <= temp) { i++; } if (i < j) { swap(arr[i], arr[j]); } } swap(arr[left], arr[i]); quicksort(arr, left, i - 1); quicksort(arr, i + 1, right); }