指针变量作实参过程中问题求解
示例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();
}