You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数指针传参疑问:传指针时是否复制指针及对象传参问题

函数中指针的工作机制解答

第一个示例的理解确认

你的理解完全正确:

  • max函数的返回值是int*类型的指针,参数同样是两个int*类型指针;
  • 调用max(&i, &j)时,&i和&j分别是变量i和j的内存地址,这两个地址会被赋值给函数的参数a和b;
  • 函数内部通过*a、*b解引用指针获取对应int值比较,最终返回指向较大值的指针(也就是存储着对应变量地址的a或b)。

直接传入指针的情况说明

在第二个示例代码中:

int *p, i, j;
int *k = &i;
p = max(k, &j);

调用max(k, &j)时,会复制指针k的值。这里的复制是指:把指针变量k中存储的i的地址,拷贝一份给函数的第一个参数a。此时a和k是两个独立的指针变量,但它们存储的地址完全相同,都指向i。

简言之:传递指针参数时,传递的是指针变量里的地址值,这个值会被复制到函数的形参中,既不会传递指针变量本身,也不会复制指针指向的对象。

对象类型的指针传递补充

如果指针指向的是自定义对象(比如结构体),传递指针参数时,同样只会复制指针本身(即对象的内存地址),不会复制指针指向的整个对象。

举个结构体的例子:

typedef struct {
    int x;
    int y;
} Point;

Point* getBigger(Point* p1, Point* p2) {
    return (p1->x + p1->y) > (p2->x + p2->y) ? p1 : p2;
}

int main() {
    Point p1 = {1,2}, p2 = {3,4};
    Point* k = &p1;
    Point* res = getBigger(k, &p2);
    return 0;
}

调用getBigger(k, &p2)时,只是把k存储的p1的地址复制给形参p1,&p2的地址复制给形参p2,整个Point对象不会被复制。这种方式既避免了拷贝大对象的性能损耗,也能让函数通过指针修改原对象(如果函数内部有相关操作的话)。

内容的提问来源于stack exchange,提问作者Caleb Renfroe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:12:43