为何在&运算符可获取相同内存地址值的情况下,仍使用指针变量引用内存地址?
为何在&运算符可获取相同内存地址值的情况下,仍使用指针变量引用内存地址?
嘿,我太懂你现在的纠结了——毕竟直接用&x就能拿到变量的内存地址,为啥还要多此一举定义个指针变量x_ptr呢?我给你唠几个实际场景,你立马就能get到指针变量的用处:
- 复用性拉满,改代码更省心:要是你在代码里十次八次要用到变量
x的地址,总不能每次都敲&x吧?万一哪天你把变量名从x改成num,那你得在全代码里找所有的&x挨个替换,想想都头大!但要是用指针变量x_ptr,只需要改初始化那一行的&x为&num,后面所有的x_ptr都不用动,省超多事儿。 - 函数传参的刚需操作:学C肯定绕不开“函数修改外部变量”的需求吧?比如写个交换两个整数的函数,你直接传
x和y过去根本没用——C是值传递,函数里改的只是副本,外面的变量半点儿变化都没有。这时候必须传指针!你把&x、&y传给函数的指针参数,函数通过指针就能直接操作原变量的内存,这才是真·修改。而且函数内部要反复操作这个地址时,直接用指针变量就行,不用每次都取地址。 - 动态内存分配的必备载体:用
malloc申请一块内存时,它返回的就是这块内存的首地址,你总得找个地方存这个地址吧?总不能每次用这块内存都重新调用malloc吧?那不仅会重复申请导致内存泄漏,还会拿到完全不同的内存块。这时候指针变量就是唯一的选择,把malloc返回的地址存进去,后续操作全靠它。 - 数组遍历的灵活玩法:C里数组名本质是指向首元素的常量指针,你没法改它的指向。但如果你想遍历数组的时候移动指针(比如用
ptr++),就可以把数组的首地址存到一个普通指针变量里,想怎么移动就怎么移动,遍历起来比用下标灵活多了。
就拿你给出的代码延伸举个例子:
#include <stdio.h> int main() { int x = 5; int *x_ptr = &x; printf("This is the value of x_ptr: %p\n", x_ptr); printf("This is the value of x using x_ptr: %d\n", *x_ptr); // 后续再加N处用到x地址的操作,直接用x_ptr就行 *x_ptr = 10; printf("Updated x value: %d\n", x); }
现在看起来用&x替代x_ptr好像也能跑,但要是后面再加十处用到x地址的代码,指针变量的优势就会立刻显现出来。
内容来源于stack exchange
相关产品推荐
相关产品推荐

