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

指针代码运行咨询:求函数f输出值及指针操作解析

解答你的C指针疑问,以及函数f的输出结果

首先直接给结论:函数f()运行后会输出 7 12,咱们一步步拆解代码,把你的疑问都讲清楚。

先把完整代码贴出来:

int j = 10;
void f() { 
    int *i; 
    i = &j; 
    *i = 7; 
    i = (int *) malloc(sizeof(int)); 
    *i = j; 
    j = j + 5; 
    printf("%d %d", *i, j); 
}

逐行拆解你的代码理解

  • int j = 10;:你理解的完全没错,全局变量j在内存中占据一块空间,初始值是10,咱们就假设它的地址是200。
  • int *i;:这是声明一个指向int类型的指针变量,此时i还没被赋值,里面是个随机的垃圾地址,暂时不能直接用来访问内存。
  • i = &j;:&j是取j的内存地址(也就是咱们假设的200),所以现在i的值变成了200——换句话说,i现在指向了j所在的那块内存空间。
  • *i = 7;:*i是「解引用」操作,意思是“去访问i指向的内存地址里存的值”。因为i现在指向j的地址,所以这行代码等价于直接写j = 7;,现在j的值就从10变成7了。

解答你的核心疑问

  1. 关于i = (int *) malloc(sizeof(int));
    这行是动态申请内存,我给你掰碎了说:

    • malloc是C标准库里的函数,专门用来从「堆内存」里申请一块指定大小的空间。sizeof(int)是计算int类型占多少字节(通常是4字节),所以这部分就是申请一块能装下一个int的内存空间。
    • malloc返回的是void*类型(通用指针),咱们需要用(int *)把它转换成int*类型,这样指针i才能正确指向这块int大小的新内存。
      执行完这行后,i就不再指向j了,而是指向了这块刚申请的新内存(比如地址是300),和j的内存完全独立。
  2. 关于*i = j;
    这里的*i是解引用现在的i(也就是指向新申请的300地址),把j当前的值(此时j是7)赋值到这块新内存里。所以现在新内存里存的是7,而j还是7,两者的内存空间互不影响。

  3. 关于j = j + 5;
    这行很直接,j当前是7,加5之后就变成12了。

最后看输出

printf("%d %d", *i, j);里:

  • *i访问的是新申请的内存里的值,也就是7;
  • j现在的值是12;
    所以输出就是7 12。

指针核心逻辑小总结

  • 指针变量本身存的是内存地址;
  • *指针是「解引用」,用来访问这个地址对应的内存里的实际值;
  • &变量是取这个变量的内存地址;
  • malloc出来的内存和原来的变量内存是独立的,修改其中一个不会影响另一个。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:07:46