指针代码运行咨询:求函数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了。
解答你的核心疑问
关于
i = (int *) malloc(sizeof(int));
这行是动态申请内存,我给你掰碎了说:malloc是C标准库里的函数,专门用来从「堆内存」里申请一块指定大小的空间。sizeof(int)是计算int类型占多少字节(通常是4字节),所以这部分就是申请一块能装下一个int的内存空间。malloc返回的是void*类型(通用指针),咱们需要用(int *)把它转换成int*类型,这样指针i才能正确指向这块int大小的新内存。
执行完这行后,i就不再指向j了,而是指向了这块刚申请的新内存(比如地址是300),和j的内存完全独立。
关于
*i = j;
这里的*i是解引用现在的i(也就是指向新申请的300地址),把j当前的值(此时j是7)赋值到这块新内存里。所以现在新内存里存的是7,而j还是7,两者的内存空间互不影响。关于
j = j + 5;
这行很直接,j当前是7,加5之后就变成12了。
最后看输出
printf("%d %d", *i, j);里:
*i访问的是新申请的内存里的值,也就是7;j现在的值是12;
所以输出就是7 12。
指针核心逻辑小总结
- 指针变量本身存的是内存地址;
*指针是「解引用」,用来访问这个地址对应的内存里的实际值;&变量是取这个变量的内存地址;malloc出来的内存和原来的变量内存是独立的,修改其中一个不会影响另一个。
内容的提问来源于stack exchange,提问作者sam786
相关产品推荐
相关产品推荐

