| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1230 人关注过本帖
标题:局部变量传参的疑惑
只看楼主 加入收藏
taking
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-10-22
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
局部变量传参的疑惑
程序代码:
void initArr(int i[3]) {
    printf(" %d ", i[0]);// 打印结果10
    i[0] = 100;
    printf(" %d ", i[0]);// 打印结果100
}
void test2() {
    int i[3] = { 10,20,30 };
    initArr(i);
    printf(" %d ", i[0]);// 打印结果100
}

为什么我这个主调函数test2()中的局部变量i, 传递给initArr,在initArr中修改i的内容,主调函数也会受到影响?
initArr中的I不该是独立栈空间新开辟的局部变量吗?照说不是只有地址传递用指针接收才能达到这效果吗?
学多级指针的时候老师说,传参相当与赋值.被调函数会自己开辟空间存放变量.
从语法角度说,如果传I就是传递地址,那么被调函数定义形参的时候不应该需要一个指针去间接引用吗?
还是说就单纯的把这个情况看成是语法糖?
搜索更多相关主题的帖子: 结果 传递 局部变量 指针 函数 
2021-10-22 19:00
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
收藏
得分:10 
Can I re-describe your question like this ?
whats the difference between the function prototype
void initArr(int i[3])
and
void initArr(int *i)
-------------------------gcc answer-------------------
no difference (maybe its a standard ?)
-------------------------the reason-------------------
gcc generates same code
-------------------------how to try-------------------
//online parser: https://www.bccn.net/run/
程序代码:
#include <stdio.h>
#include <stdlib.h>

//#define ARG_TYPE
#ifdef ARG_TYPE
void initArr(int i[3])
#else
void initArr(int *i)
#endif
{
    printf("sub[i] = %d\n", i[0]);
    i[0] = 100;
    printf("sub[i] = %d\n", i[0]);
}

int main(int argc, char *argv[])
{
    int i[3] = {10, 20, 30};
    
    initArr(i);

    printf("main[i] = %d\n", i[0]);
    
    system("gcc *.c -o v.out");
#ifdef ARG_TYPE
    system("objdump -d v.out > a.txt");
    system("cat a.txt");
#else
    system("objdump -d v.out > b.txt");
    system("cat b.txt");
#endif
    system("diff a.txt b.txt");

    return 0;
}


output sample:
......
<   4004ef:    49 c7 c0 20 07 40 00     mov    $0x400720,%r8
<   4004f6:    48 c7 c1 b0 06 40 00     mov    $0x4006b0,%rcx
---
>   4004ef:    49 c7 c0 30 07 40 00     mov    $0x400730,%r8
>   4004f6:    48 c7 c1 c0 06 40 00     mov    $0x4006c0,%rcx
......

So, finally you will find that nothing is different except the dynamic address
2021-10-22 19:25
taking
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-10-22
收藏
得分:0 
Thanks,quite clear,good good study,day day up!
2021-10-22 19:55
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:10 
局部变量i, 传递给initArr,在initArr中修改i的内容
不,你没有修改i的内容,你修改的是i指向的内容。
收到的鲜花
  • lin51616782021-10-22 23:09 送鲜花  5朵  
2021-10-22 20:56
快速回复:局部变量传参的疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020496 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved