一个C语言排序中 指针的问题,C语言高手请进

来源:百度知道 编辑:UC知道 时间:2024/05/25 04:52:10
题目:将数组0 1 2 3 4 5 6 7 8 9中的元素反过来。结果得到:9 8 7 6 5 4 3 2 1 0
我的问题:我按下面的的程序做了,结果是0 1 2 3 4 5 6 7 8 0,除了把i=j;改为*i=*j;答案才正确,请高手解释一下,i=j;和*i=*j;不是都传的是地址吗,怎么i=j;就不行?

程序:
include <stdio.h>

void main(void)
{

void reversal();
static int a[10] = {0,1,2,3,4,5,6,7,8,9}; /* 建立一个数组并初始化 */
int i;
for (i=0;i<10;i++)
{
printf("%d ",*(a+i));
}
printf("\n");
reversal(a,10); /* 调用自定义涵数进行反向显示排序,并把数组a的起始地址传送给形式参数x */

for (i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");

}

void reversal(int *x,int n)
//int *x,n; /* 定义x为指针变量 */
{
int temp,*p,*i,*j; /* 这里需要注意的是temp用与交换的时候临时存储数据的 */
i = x; /* 利用指针变量i存储数组a的起始地址 */
p = x + ((n-1)/2); /* 计算最后一次循环的时候数组a的地址 */
j = x + n - 1; /* 计算数组a也就是a[9]的结束地址好用于交换 */
for (;i<=p;i++,j--) /* 利用

在C语言中,指针变量用于保存储存数据的内存的地址,注意指针变量保存的是地址而不是那个地址所保存的数据的值,如果直接使用指针变量,比如i=j这种用法,那么是对指针变量进行操作而不是指针指向的那个地址所保存的数据。
比如现在i的值为0xFFEE4536(16进制表示的内存地址),而i指向的值(即编号0xFFEE4536的这块内存中保存的值)是1,j的值为0xDFAA4109,j指向的值是2,如果让i=j,那么i的值将变成0xDFAA4109,i指向的值将会是2了(特别注意,这个时候,i原来的指向丢失了,但是内存空间又没有释放,这是程序设计时候的禁忌,不要做这样类似的操作,除非你已经安排好内存的释放工作)。
如果想直接更改指针指向的值,那么需要使用解除引用运算符*(解除引用,就是取指针变量指向的值),即若想直接更改i指向的值为j指向的值,就使用*i=*j,这样,i和j的值都没有变,但是i指向的值(编号0xFFEE4536的这块内存中保存的值)就变成了2。

总结来说,i=j,是更改了i的值而不是i指向的值,更改了地址却没有改变地址中的数据,*i=*j,是更改了i指向的值而不是i的值,更改了数据却没有变动地址。

在这个程序里,你想交换两个指针变量指向的值,那么就需要使用解除引用的方式*i=*j来取值然后交换,如果使用i=j,那么i和j指向的就是同一个数值了,肯定会出错。

i=j和*i=*j是完全不一样的,虽然有的时候i=j和*i=*j能够取得同样的结果,但是为了保证逻辑正确,也避免出现性能差错,最好还是该用什么用什么。

i=j是把J的值付给I
*i=*j是把J的地址给I

这个是指针的问题
认真去看看指针那方面的内容吧