为什么C语言无Pointer的swap函数失效,而padovan函数无需Pointer可正常运行
根本原因:C语言默认使用值传递方式传递函数参数
函数调用时传入的实参会被拷贝一份独立的副本存入函数的栈帧空间,函数内部所有对形参的操作都是针对这个副本进行,默认不会影响函数外部的原实参本身。
1. swap1函数无法实现交换的原因
#include <stdio.h> void swap1(int a, int b) { int tmp; tmp = a; a = b; b = tmp; return; } int main() { int x = 1, y = 2; swap1(x,y); printf("%d %d",x,y); return 0; }
swap1的核心需求是修改main函数中x、y两个原变量的值,而值传递模式下,swap1的形参a、b只是x、y的独立副本,函数内部交换的只是a、b两个临时副本的值,执行完swap1后副本就会被销毁,main函数里的x、y完全没有被修改,自然无法实现交换。如果要实现修改原变量的需求,就需要传入原变量的地址(指针),让函数通过地址直接操作原内存空间的数值。
2. padovan函数不需要指针就能正常运行的原因
#include <stdio.h> int padovan(int n); int main() { int n; printf("Enter number : "); scanf("%d",&n); printf("Result : %d",padovan(n)); } int padovan(int x) { if(x == 0 || x == 1 || x == 2) return 1; else if(x > 2) return padovan(x-2) + padovan(x-3); }
padovan的核心需求是读取传入的参数值做计算,再把计算结果通过return返回给调用方,全程不需要修改函数外部的原参数n的值。值传递模式下函数拿到的参数副本已经可以满足读取数值做计算的需求,计算结果通过返回值就能带回main函数,所以不需要指针也能正常运行。
两者差异的核心逻辑
- swap函数需要修改函数外部的原变量,值传递操作副本无法满足需求,必须用指针
- padovan函数只需要读取参数值、返回计算结果,不需要修改原参数,值传递足够满足需求
内容的提问来源于stack exchange,提问作者WWoPPoWW
相关产品推荐
相关产品推荐

