CS61C | lecture3
运算优先级
$x\&1==0$ 是 $x\&(1==0)$ 而不是 $(x\&1)==0$
1 | int main() { |
Struct Alignment
在 32 位架构上,int 为 4 字节,short 为 2 字节,指针为 4 字节。
1 | struct hello { |
没有对齐的情况下 sizeof(hello) = 4 + 1 + 2 + 4 + 1 = 12
对齐的情况下,存在填充使得边界都为 2 的倍数。
sizeof(hello) = 4 + 1 + 1 + 2 + 4 + 1 + 3 = 16
如果更换位置,使得 e 在 b 右侧填充的位置,则可以节约空间。
1 | struct hello { |
sizeof(hello) = 4 + 1 + 1 + 2 + 4 = 12
Arrays and Pointers
ar[0] = *ar
ar[2] = *(ar + 2)
初始化数组有 3 种方式
1 | for(i = 0; i < SIZE; i ++) |
1 | int foo(int array[], unsigned int size) |
在 foo 函数中 sizeof(array) 实际上是 sizeof(int *)。数组在传递给函数时实际上是以指针传递,编译器永远不知道数组的大小,编译器只是把它当作指针。
在 32 位架构上,foo 函数中 sizeof(array) 为 4。
而在 main 函数中编译器知道数组的大小,所以 sizeof(a) = 40。
字符串数组末尾编译器会自动添加 null 终止符,而字符数组则需我们手动添加。
1 | char letters[] = "abc"; |
1 |
|
*—p 先对 p 进行自减,再解引用。
++*p 对 *p 进行自增。
*p++ 返回 *p 再自增 p
1 | char *p = "hi"; // 假设 p 存着 40 |
1 | char c = *p ++; // c = 'h', p = 41; |
(*p) ++ 返回 *p 并对 (*p) 自增
1 | char arr[] = "bye"; |
Pointers and Structures
1 | struct Point { |
点访问
1 | int h = pt1.x; |
箭头访问(专门用于指针)
1 | int h = ptaddr -> x; |
地址的赋值,一个结构体发生改变,另一个也会随之改变。
1 | pt1 = pt2; |
1 | void IncrementPtr(int *p) |
p 将会被移到下一个位置,但是 q 不变。
1 | void IncrementPtr(int **h) |
让 h 指向 q 指针,从而让 q 移动。
1 | int x[] = {2, 4, 6, 8, 10}; |
(*(*pp)) ++ 也就是 (*p) ++ = 4 ++ = 5
最终输出 5。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Birdy の 小窝!
评论