• sky
    2021-12-25
    有个疑问,算数运算一节,右侧汇编代码样例中sub rbp 32,说明栈分配了32字节,但二维数组实际只占4*6=24字节,剩余8字节是做什么用的?

    作者回复: 这是一个好问题!实际上这是由于 SysV 规范要求在函数调用前,栈顶需要在 16 字节的边界对齐(我们曾在第 05 讲中提到过)。因此由于这里在栈中需要存放 6 个元素,需要至少 24 字节的空间。所以为了对齐到 16 字节,rsp 的值要减少至少 32 字节。

    共 2 条评论
    13
  • Joker
    2022-05-16
    老师,将二维数组指针等同于二级指针是否不太准确呢?因为从本质上来说二者是有根本区别的,二维数组名对应的地址值和arr[0][0]的地址值是一样的,只不过两者对应的指针类型一个为int (*)[3],一个为int *。而二级指针为指针的指针,在此处对应的类型应该是int **。所以我认为二维数组指针本质上还是一个一级指针,不知道我这样的理解有没有问题?

    作者回复: 感谢指正!你理解的没错,两者之间确实有些差异,我来修改一下表述。

    
    4
  • 纳兰容若
    2022-04-13
    老师您好 向您请教一下arr[3] == 3[arr]的问题 我实际运行的结果是两者是相等的 arr[3] 不应该是 [arr地址 + 3 * sizeof(int)]位置的数值么 3[arr] 是 [3 + arr地址]?[3 + arr地址 * sizeof(int)]?位置的数值 两者为什么会相同呢 还是我理解错了

    作者回复: 这里不要从 C 代码的形式上扣哈,可以直接看编译器产物的结果。你会发现 3[arr] 与 arr[3] 产生的机器代码是完全一致的。因为编译器在解析 C 代码时可以通过判断括号左侧和括号内的值是不是 Constant Value 来判断当前这个值是应该作为索引,还是数组首地址来使用。

    共 3 条评论
    1
  • zxk
    2022-01-22
    老师,关于 ”在某些特定的使用方式下,编译器会将数组类型退化为指针类型“,那这个是属于使用不当,还是一种优化手段?不太明白这个行为会有什么后果及应用场景。

    作者回复: 好问题。我们这里讲到的“数组退化到指针”实际上是 C 语言在设计上的一种性质,并不是使用不当或者优化手段。这个性质出现的原因要追溯到 C 语言的前身 B 语言中的类似设计上。在大多数场景下,需要注意问题就是变量性质(数组大小、数组类型)的丢失。

    
    1
  • I
    2021-12-24
    答案是5,arr+1为arr1 0,然后再加一为1 1,所以为5

    作者回复: 答案正确!

    共 2 条评论
    1
  • Victor
    2021-12-26
    虽然编译过了,但这个可读性太差了

    作者回复: 哈哈哈是的,所以正常项目中不要使用哈。

    
    
  • qinsi
    2021-12-25
    因为 a[i] = *(a + i) 所以 x[y[i]] = x[*(y + i)] = x[*(i + y)] = x[i[y]] = *(x + i[y]) = *(i[y] + x] = i[y][x] 在用到多级间接下标时可以避免嵌套中括号
    
    5
  • =
    2022-01-07
    printf("%d\n", *(*(arr + 1) + 1)); // 结果为5 arr+1后,二级指针指向arr[1] *(arr+1)后,一级指针指向arr[1][0] *(arr + 1) + 1后,一级指针指向arr[1][1] *(*(arr + 1) + 1))后,解引用出结果5 文末的代码可以编译通过,而且arr[3]
    
    4
  • 无双BaOY_WHA
    2021-12-24
    arr[3] 和 3[arr] 映射到汇编代码上是一样的。但没见过 3[arr] 这种写法…
    
    2
  • Geek_00a01d
    2022-12-20 来自河南
    思考题 交作业 相等 printf("%d", arr[3] == 3[arr]); warning: self-comparison always evaluates to true [-Wtautological-compare] 由上面同学的解答可知 arr[3]= *(arr+3) = *(3+arr) = 3[arr]
    
    