| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2381 人关注过本帖
标题:指针变量作实参过程中问题求解
只看楼主 加入收藏
南国迦叶
Rank: 2
等 级:论坛游民
帖 子:46
专家分:20
注 册:2010-7-9
结帖率:88.24%
收藏
已结贴  问题点数:10 回复次数:7 
指针变量作实参过程中问题求解
示例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
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:7 
一个变量在定义后但又未赋值的情况下,其在内存中地址是不是就已经分配好了(这里说的分配好说的是首地址编号已确定)
这个问题分 两个概念的
1.静态
2.动态

1.静态用于基本数据类型的变量声明
包括 int float short char long  指针*  数组   这个是在变量声明后 内存地址就被分配了的
2.动态部分
包括 struct 共用体 的结构中的,这个是要用malloc系列函数来操作的,声明这样的变量后,是不给结构体分配地址的  但是指向结构体的指针是会分配地址的
 

我要成为嘿嘿的黑客,替天行道
2012-11-21 21:21
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
2.我们说一个整形数据在内存中占用两个字节的空间,从第1行输出可以看出,&a与&b地址编号之间相差4,如果这里所示的&a与&b地址编号均是&a与&b首地址,那和占用两个字节空间的说法是不是相悖?(网上看的视频介绍占用空间时是举例说整形1001-1003,1003-1005)


这个int型的字节大小 是和具体的计算机的有关的  16位的就是 16位 2个字节  32位的就是4个字节   你上面说的不相同是你认为你的计算机是16位的 而实际上你的计算机器是32位的

我要成为嘿嘿的黑客,替天行道
2012-11-21 21:23
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
3.对于指针变量t1与t2在赋地址前的地址输出,我上面没有给出,但是我练习时发现很没有规律,有时输出一位数字0或2,有时又输出与上面a地址位数一样的数字,有时又输出比a地址位数多的数字,所以问哈指针变量的地址输出在赋地址前是不是不同于我问题1中所说的整形变量,是没有规律的那种?

对于指针 他有三个属性
1.地址值 p
2.地址值指向的值 *p
3.地址值的引用规则 p+1后*(p+1)的问题

用个实例
int *p
这个个声明是说p是指向int型的指针
那么他的属性分析就是
1.p代表的是地址值
2.*p指向的是int类型的 *P进行的是 int类型的计算
3.地址的引用规则说的是  对地址值的运算 用运算符*的指向问题
比如*(p+1)
 p+1代表的含义就是对p的地址值加sizeof(int)   *(p+1)指向的就是下一个数据了

[ 本帖最后由 zhu224039 于 2012-11-21 21:42 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-11-21 21:32
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 

 
对于数组作为函数作为函数的形参 参数传送问题

你给出的事例跟这个问题是没关系的

因为你传给函数的是一个指针变量  而不是数组名

数组名 是一个常量值(立即数)他是不占内存的  参与+ - * / 后 是不会发生变化的
指针变量 是一个变量 占用地址的 参与运算后 他的值是会发生变化的

我要成为嘿嘿的黑客,替天行道
2012-11-21 21:41
南国迦叶
Rank: 2
等 级:论坛游民
帖 子:46
专家分:20
注 册:2010-7-9
收藏
得分:0 
回复 5楼 zhu224039
首先很感谢你耐心的解答,你的意思是说数组名作为实参传递的是地址并回传给主调函数这一论述与后面说的指针变量作实参传地址但不回传是两码事,他们是各自独立的,是这意思吗?+
如果是这意思的话,我弱弱的追问一下,这两种传的都是地址,为什么会有一个回传一个不回传的区别呢?
2012-11-22 09:42
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
不是的啦 你看你的程序赛  你把数组的地址赋值给了指针变量

我要成为嘿嘿的黑客,替天行道
2012-11-22 20:00
南国迦叶
Rank: 2
等 级:论坛游民
帖 子:46
专家分:20
注 册:2010-7-9
收藏
得分:0 
回复 7楼 zhu224039
没有吧,我那个数组的示例与指针的示例是两个不同的程序哦,所以呢,我就是想问数组示例中数组名作实参时,实参向形参传递的是首地址,所以才会在形参参加完运算后把它的新的数组元素值返回给实参(因为两者是共用地址的嘛,教材是这样讲的,我用上面示例试过了也确实如此);而那个指针的示例呢,显然传的也是地址,因为指针变量就是储存的地址,可是同样是传地址,为什么在形参运算完了后,指针那个示例不会把新的值一并带回主调函数中的实参呢?就是这里不理解啊!
2012-11-26 09:23
快速回复:指针变量作实参过程中问题求解
数据加载中...
 
   



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

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