C语言,函数参数是变量,函数内使用指针。

我是弄java的,因为最近需要使用jni,也需要编写一些C语言程序,现在函数指针这里出现问题,函数传递的参数是不同的,但是在函数内部打印出来的参数地址为什么就变成相同的呢?
#include <stdio.h>
int show1(int number);
int show2(int number1);

int main(void)
{
int number = 10;
int number1=3;
//printf("\n show1 number is : %d,and number's address is :%p\n",number,&number);
//printf("\n show1 number is : %d,and number1's address is :%p\n",number1,&number1);
show1(number);
show2(number1);
return 0;
}

int show1(int number)
{
//int *pnumber = &number;
//*pnumber *= 2;
printf("\n show1 *pnumber is : %d,and pnumber's address is :%p\n",number,&number);
return 0;
}

int show2(int number1)
{
//int *pnumber1 = &number1;
printf("\n show2 *pnumber is : %d,and pnumber's address is :%p\n",number1,&number1);
return 0;
}

我执行了你的程序,结果是:

show1函数执行的时候,number放在地址0012FF2B里,但是执行完后这个地址系统就回收了,不再保存number。

到show2函数执行的时候,恰好系统也给number1分配了这个地址0012FF2B,这个时候地址0012FF2B放的是number1.

所以这里没有存在冲突的地方。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-02

你可能误会了、你这个完全没有用到指针、只是传了一个形参、show1和show2里面的number只是main中相应数据的一份拷贝、只不过是拷贝到了同一地址(因为show1结束后其所占用的内存被收回,而为show2分配空间时再次使用了该地址),如果你在show1()或show2()里面改变number的值你会发现main()里面相应变量的值是不会变的,如果你想在show1和show2中分别打印出主函数中所定义的两个变量,或改变其值,就要用到指针了,具体改动如下

#include <stdio.h>
int show1(int*number);
int show2(int*number1);
int main(void)
{
    int number = 10;
    int number1=3;
    //printf("\n show1 number is : %d,and number's address is :%p\n",number,&number);
    //printf("\n show1 number is : %d,and number1's address is :%p\n",number1,&number1);
    show1(&number);
    show2(&number1);
    return 0;
}
int show1(int*number)
{
    //int *pnumber = &number;
    //*pnumber *= 2;
    printf("\n show1 *pnumber is : %d,and pnumber's address is :%p\n",*number,number);
    return 0;
}
int show2(int*number1)
{
    //int *pnumber1 = &number1;
    printf("\n show2 *pnumber is : %d,and pnumber's address is :%p\n",*number1,number1);
    return 0;
}

本回答被提问者采纳
第2个回答  2013-08-02
这个就是C语言的所谓“值传递”
1)虽然你传递的参数不同,num1,num2;但是C编译出来不会把num1/2本身地址传递进去,只是把值传递进去
2)把值传递进去就意味着不使用原来的&num1,&num2两个内存单元来储存这个值,所以系统要提供其它的内存单元来存储和传递这个值。
3)具体使用什么样的内存单元来来储存和传递这个值则是C语言相关也是体系相关。X86使用stack来传参数,ARM/MIPS则使用寄存器来传参数。
4)在X86的体系内,会分配一个4字节的stack地址来存储你的参数,所以打印出来的是该stack单元地址
5)你的两个函数调用都是一个入参数,也就是进入时分配一个stack,退出时释放该stack,所以打印出来的stack地址总是一样的
6)你可以尝试改成shownum1传入2个入参(num1,num2),然后里面在嵌套调用shownum2也是两个入参(num1,num2),打印出来的地址绝对是不一样的。因为show1的stack还没有释放,机械调用show2,它就不能重复利用show1的stack地址了。
第3个回答  2013-08-02
因为在C语言中,你传递的是形参而已,你如果把两个show函数里面的语句放到main函数中执行就肯定不会地址相同,函数调用完的时候估计number形参这个内存已经释放了,然后你调用show2的时候,又在原本形式参数number的内存位置生成一个number1的形式参数,所以就一样咯
第4个回答  2013-08-02
这是因为C语言的函数参数传递是按值传递的,不是按地址传递,参数从实参传递给形参时是拷贝一份然后传递,不影响原来参数的值。并且下次再传递时还是占用这一块临时区。所以地址是一样的。
相似回答