08|操控资源:指针是如何灵活使用内存的?
该思维导图由 AI 生成,仅供参考
指针的基本使用
- 深入了解
- 翻译
- 解释
- 总结
C语言指针的基本使用方式、指针与数组的关系、指针的算数与关系运算,以及堆内存指针的灵活操控能力是本文的重点内容。文章详细介绍了指针的基本使用、指针与数组的关系以及指针的其他运算,为读者提供了全面的指针知识。指针的灵活性使得程序员可以更加灵活地使用内存,但需要注意避免一些操作,如解引用未初始化的指针、函数返回指向其内部局部变量的指针等。此外,对堆指针进行有效的生命周期管理也是需要注意的问题。文章还介绍了堆内存的重要性,以及堆内存相对于栈内存的优势,如动态生成数据、灵活的生存期等。总之,本文通过介绍C语言中指针的基本使用方式、指针与数组的关系、指针的算数与关系运算以及堆内存指针的灵活操控能力,为读者提供了全面的指针知识,并强调了指针使用中需要注意的问题。
《深入 C 语言和程序运行原理》,新⼈⾸单¥59
全部留言(14)
- 最新
- 精选
- sky有个疑问,算数运算一节,右侧汇编代码样例中sub rbp 32,说明栈分配了32字节,但二维数组实际只占4*6=24字节,剩余8字节是做什么用的?
作者回复: 这是一个好问题!实际上这是由于 SysV 规范要求在函数调用前,栈顶需要在 16 字节的边界对齐(我们曾在第 05 讲中提到过)。因此由于这里在栈中需要存放 6 个元素,需要至少 24 字节的空间。所以为了对齐到 16 字节,rsp 的值要减少至少 32 字节。
2021-12-25213 - Joker老师,将二维数组指针等同于二级指针是否不太准确呢?因为从本质上来说二者是有根本区别的,二维数组名对应的地址值和arr[0][0]的地址值是一样的,只不过两者对应的指针类型一个为int (*)[3],一个为int *。而二级指针为指针的指针,在此处对应的类型应该是int **。所以我认为二维数组指针本质上还是一个一级指针,不知道我这样的理解有没有问题?
作者回复: 感谢指正!你理解的没错,两者之间确实有些差异,我来修改一下表述。
2022-05-165 - 纳兰容若老师您好 向您请教一下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 来判断当前这个值是应该作为索引,还是数组首地址来使用。
2022-04-1341 - zxk老师,关于 ”在某些特定的使用方式下,编译器会将数组类型退化为指针类型“,那这个是属于使用不当,还是一种优化手段?不太明白这个行为会有什么后果及应用场景。
作者回复: 好问题。我们这里讲到的“数组退化到指针”实际上是 C 语言在设计上的一种性质,并不是使用不当或者优化手段。这个性质出现的原因要追溯到 C 语言的前身 B 语言中的类似设计上。在大多数场景下,需要注意问题就是变量性质(数组大小、数组类型)的丢失。
2022-01-221 - I答案是5,arr+1为arr1 0,然后再加一为1 1,所以为5
作者回复: 答案正确!
2021-12-2421 - Victor虽然编译过了,但这个可读性太差了
作者回复: 哈哈哈是的,所以正常项目中不要使用哈。
2021-12-26 - qinsi因为 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] 在用到多级间接下标时可以避免嵌套中括号2021-12-255
- =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]2022-01-0714
- 无双BaOY_WHAarr[3] 和 3[arr] 映射到汇编代码上是一样的。但没见过 3[arr] 这种写法…2021-12-242
- Geek_00a01d思考题 交作业 相等 printf("%d", arr[3] == 3[arr]); warning: self-comparison always evaluates to true [-Wtautological-compare] 由上面同学的解答可知 arr[3]= *(arr+3) = *(3+arr) = 3[arr]2022-12-20归属地:河南