共用体和数组问题三例,100分悬赏

来源:百度知道 编辑:UC知道 时间:2024/06/02 13:26:23
一、数组元素地址交换
数组中元素的交换一般采用直接交换其元素值的方式,前几天看到指针章节的时候,就想能不能采取交换数组元素地址的方式交换其元素,如果不能又会产生什么样的结果。
于是就自己编了如下一个排列数组的小程序:
main()
{int a[3]={1,3,2};
int i,j,*temp;
for(i=0;i<2;i++)
for(j=1;j<3;j++)
{if(a[i]>a[j])
{temp=&a[i];
&a[i]=&a[j];
&a[j]=temp;
}
}
for(i=0;i<3;i++)
printf("%d",a[i]);
}
运行时会出错,不知道出错在哪里?

二、通过指针数组间接实现数组元素交换
编程如下:
main()
{int a[3]={3,1,2};
int *p[3],i,j,*temp;
for(i=0;i<3;i++)
p[i]=&a[i];
for(i=0;i<2;i++)
for(j=1;j<3;j++)
{if(*(p+i)>*(p+j))
{temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
for(i=0;i<3;i++)
printf("%d",*p[i]);
}
运行后会输出312,没有实现排序的目的,原因何在?

三、一道共用体题目
struct w_tag
{char low;
char high;
};
uni

1. 这个问题是数组概念的问题,数组指的是内存中连续的一段,这一段内存中每一个单元就是数组的一个元素,每个单元的地址是不可改变的。实际上&操作符得到的结果都是不可改变的,因为它是地址,不是指针。
2. 这个程序思路没错,用这种方式是可以实现排序的,但楼主有一处笔误,判断两个元素大小的那一句应该改成if (*(*(p + i)) > *(*(p + j))),因为p本身就是一个指针数组的首地址,*(p + i)表示第i个元素,仍然是个指针,*(*(p + i))才表示第i个元素指向的变量。
3. 这个问题是共用体概念的问题。共用体在内存中是表现为多个变量占用同一段内存,也就是说这多个变量的值是相互影响的,你改变一个,其他的都会跟着变。举个简单的例子来说,对于0x41这个字节来说,如果把它当作整数(int)来看,他就是0x41(十进制65),如果把它当作一个字符(char)来看,他就是'A'。如果有这么一个共用体:
union ut { int n; char c } u;
那么如果执行u.n = 0x41,u.c的值就会变成'A',如果执行u.c = 'B',u.n的值就会变成0x42。一般来说共用体内的多个变量有不同的类型,因此同一时刻只有一个变量有意义,其他变量也是有值的,但他们的值都没有意义。所以书上为了简便就说只有一个变量有意义。
楼主这三个问题都是关于内存的概念的问题,多写写程序,对内存的理解深入了就自然明白了。

1。数组需要连续的空间地址来存储数据,地址是一个连续的空间,自然不能靠改变地址来实现。

2。对排序操作,对地址操作没有意义的,一位地址始终指向存储的地址,a[];操作后的结果也都是a的值3,1,2
可改如下:
#include <stdio.h>
main()
{int a[3]={3,1,2};
int p[3],i,j,temp;
for(i=0;i<3;i++)
p[i]=a[i];
for(i=0;i<2;i++)
for(j=1;j<3;j++)
{if(p[i]&g