| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2381 人关注过本帖
标题:指针变量作实参过程中问题求解
取消只看楼主 加入收藏
南国迦叶
Rank: 2
等 级:论坛游民
帖 子:46
专家分:20
注 册:2010-7-9
结帖率:88.24%
收藏
已结贴  问题点数:10 回复次数:2 
指针变量作实参过程中问题求解
示例1.
#include<stdio.h>
int swap(int *p1,int *p2)
{
    int *p;                /*以下完成p1与p2地址之间的交换*/
    p=p1;
    p1=p2;         
    p2=p;
    printf("p1=%d,p2=%d\n",p1,p2);
    printf("*p1=%d,*p2=%d\n",*p1,*p2);
}
main()
{   
    int *t1,*t2,a,b;
    printf("&a=%d,&b=%d\n",&a,&b);
    scanf("%d,%d",&a,&b);
    getchar();
    printf("&a=%d,&b=%d\n",&a,&b);
    t1=&a;
    t2=&b;
    printf("t1=%d,t2=%d\n",t1,t2);
    printf("*t1=%d,*t2=%d\n",*t1,*t2);
    if (a<b)
    {
        swap(t1,t2);
    }
    printf("t1=%d,t2=%d\n",t1,t2);
    printf("*t1=%d,*t2=%d\n",*t1,*t2);
    printf("&a=%d,&b=%d\n",&a,&b);
    getchar();
}
以上程序的输出如下:
&a=2293564,&b=2293560            /第1行/
2,6    (2与6为输入的a与b的值)    /第2行/
&a=2293564,&b=2293560            /第3行/
t1=2293564,t2=2293560            /第4行/
*t1=2,*t2=6                      /第5行/
p1=2293560,p2=2293564            /第6行/
*p1=6,*p2=2                      /第7行/
t1=2293564,t2=2293560            /第8行/
*t1=2,*t2=6                      /第9行/
&a=2293564,&b=2293560            /第10行/
问题1.根据输出结果的第1行与第3行可以看出,a与b两个值在内存中的地址在给值前后就已经分配好了,所以想问下,一个变量在定义后但又未赋值的情况下,其在内存中地址是不是就已经分配好了(这里说的分配好说的是首地址编号已确定),这个问题只是确认下。
2.我们说一个整形数据在内存中占用两个字节的空间,从第1行输出可以看出,&a与&b地址编号之间相差4,如果这里所示的&a与&b地址编号均是&a与&b首地址,那和占用两个字节空间的说法是不是相悖?(网上看的视频介绍占用空间时是举例说整形1001-1003,1003-1005)
3.对于指针变量t1与t2在赋地址前的地址输出,我上面没有给出,但是我练习时发现很没有规律,有时输出一位数字0或2,有时又输出与上面a地址位数一样的数字,有时又输出比a地址位数多的数字,所以问哈指针变量的地址输出在赋地址前是不是不同于我问题1中所说的整形变量,是没有规律的那种?
4.这是关于函数调用传值的问题:对于以下示例2中,是数组名作为函数参数,将数组a的各元素传到自定义函数中进行位置互换后,在主函数中将新的数组元素输出。那对于示例1,主函数将t1与t2的地址传给p1与p2后,p1与p2实现了地址的互换,可是根据示例1输出结果的第4与第8行可以看出,t1与t2的地址并没有因为p1与p2地址互换后而传回给t1与t2,仍然是之前的地址。对于这样的区别不是很理解!因为在涉及到学习数组名作函数实参的时候,还特别有人指点说数组名做实参是传地址,数组元素作实参是传值,而示例1不就是传地址吗,为什么地址反而带不回主调函数呢?对这个疑问,有人说指针变量作实参时,传到被调函数中的地址就相当于是copy了一份地址,而copy的同时,主调函数实参地址仍然不变?迷糊了,这一点盼详细解答!!!

示例2. (此程序为将一个数组的第一与最后一个元素,第二与倒数第二个互换后,依次类推并输出新的数组)
#include<stdio.h>
int change(int b[3])
{   
    int t,n,i=0,j=3;
    for (i,n=j-1;i<n;i++,n--)  
    {
        t=b[i];
        b[i]=b[n];
        b[n]=t;
    }
}
main()
{
    int i,k,a[3];
    for (k=0;k<3;k++)
    {
        scanf("%d",&a[k]);
        getchar();
    }
    change(a);                 
    for (i=0;i<3;i++)
    {
        printf("%3d",a[i]);
    }
    getchar();
}
搜索更多相关主题的帖子: include 
2012-11-21 21:04
南国迦叶
Rank: 2
等 级:论坛游民
帖 子:46
专家分:20
注 册:2010-7-9
收藏
得分:0 
回复 5楼 zhu224039
首先很感谢你耐心的解答,你的意思是说数组名作为实参传递的是地址并回传给主调函数这一论述与后面说的指针变量作实参传地址但不回传是两码事,他们是各自独立的,是这意思吗?+
如果是这意思的话,我弱弱的追问一下,这两种传的都是地址,为什么会有一个回传一个不回传的区别呢?
2012-11-22 09:42
南国迦叶
Rank: 2
等 级:论坛游民
帖 子:46
专家分:20
注 册:2010-7-9
收藏
得分:0 
回复 7楼 zhu224039
没有吧,我那个数组的示例与指针的示例是两个不同的程序哦,所以呢,我就是想问数组示例中数组名作实参时,实参向形参传递的是首地址,所以才会在形参参加完运算后把它的新的数组元素值返回给实参(因为两者是共用地址的嘛,教材是这样讲的,我用上面示例试过了也确实如此);而那个指针的示例呢,显然传的也是地址,因为指针变量就是储存的地址,可是同样是传地址,为什么在形参运算完了后,指针那个示例不会把新的值一并带回主调函数中的实参呢?就是这里不理解啊!
2012-11-26 09:23
快速回复:指针变量作实参过程中问题求解
数据加载中...
 
   



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

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