C语言中直接传递变量地址给函数的写法是否正确可接受?
C语言指针传参问题解答
首先明确两个C语言的基础特性:
- 整型指针存储的是其所指向的整型变量的内存地址,对指针做解引用操作,即可直接读写对应地址上存储的整型值。
- C语言本身没有原生的「传引用」语法,常说的传引用调用本质是传递内存地址:把原始变量的地址作为参数传入函数,函数内部通过解引用地址直接操作原始变量,而非操作函数栈上的变量副本。
第一种写法是否可接受
第一种写法完全合法可用,不存在任何语法或逻辑错误,是C语言中通过指针修改函数外变量的标准写法之一。
调用square函数时直接传入&var,即局部变量var的内存地址,和形参int *p的类型完全匹配。函数内部通过*p解引用拿到var的原始值计算平方,再将结果写回p指向的内存地址(也就是var所在的栈内存位置),最终printf会正确输出平方后的结果100。
对应代码如下:
#include<stdio.h> void square(int *p) { *p = (*p)*(*p); } int main() { int var = 10; square(&var); // 直接传入变量的内存地址 printf("\nSquared value : %d",var); return 0; }
两种写法的功能一致性
两种写法功能完全等价,运行效果没有任何区别。
第二种写法只是额外定义了一个整型指针变量ptr,先把var的地址赋值给ptr存储,再把ptr作为参数传入square。本质上传给形参p的地址值和第一种写法完全相同——指针变量ptr本身只是一个存储地址的容器,容器里存的内容和直接取&var拿到的地址没有差别,函数内部解引用后操作的都是var所在的同一块内存,对var的修改效果完全一致。
唯一的差异是第二种写法多声明了一个没有额外作用的临时指针变量,属于冗余写法,实际开发中一般不会这么写,但不影响程序运行结果。
对应代码如下:
#include<stdio.h> void square(int *p) { *p = (*p)*(*p); } int main() { int var = 10; int *ptr; ptr = &var; square(ptr); // 传入存储了var地址的指针变量 printf("\nSquared value : %d",var); return 0; }
内容的提问来源于stack exchange,提问作者user17455953
相关产品推荐
相关产品推荐

