一个c语言指针的问题?请高手帮忙

来源:百度知道 编辑:UC知道 时间:2024/05/24 18:40:09
程序为:
#include<stdio.h>
#define N 10
#define M 3
void exchange(int *p)
{
int i,t;
for(i=0;i<M;i++)
{
t=*(p+N-1-i);
*(p+N-1-i)=*(p+i);
*(p+i)=t;
}
}
void main()
{
int a[N],i,*pointer;
pointer=a;
printf("enter array a:\n");
for(i=0;i<N;i++)
scanf("%d",pointer++);/*把pointer++改为pointer+i就对,为什么?*/
exchange(pointer);
pointer=a;
for(i=0;i<N;i++)
printf(" %d",*pointer++);
printf("\n");
}
程序编译没有错,运行结果错误,把scanf语句中的pointer++改为pointer+i就对,为什么?*/请高手帮忙,谢谢

你的错不在你说的那个地方,而在exchange(pointer); 这条语句上。由于你在for循环内用pointer++不断更新pointer,当循环退出的时候pointer指向的是a[N],注意这时候你的pointer已经越界了,而你把pointer当成数组a传给exchange显然错的,你真正想传给exchange的是a。把pointer++改成pointer+i是对的,这个时候,pointer没有被更新,到for循环退出的时候,仍然指向的是数组a的头元素,所以你把pointer传给exchange就相当于把数组a传给了它,这正是你所希望的。

for(i=0;i<N;i++)
scanf("%d",pointer++);/*把pointer++改为pointer+i就对,为什么?*/
对数组内个数据循环添加
但是pointer是指针变量
pointer++=>pointer=pointer+1 救是指向了下一个指针了,不能构成一个数组
pointer=pointer+i

pointer++和pointer+i存在本质的不同
pointer++改变了pointer 的指向,事实上
经过for(i=0;i<N;i++)
scanf("%d",pointer++);pointer已经指向了&a[N],而不再是a的地址

于是在调用
void exchange(int *p)
{
int i,t;
for(i=0;i<M;i++)
{
t=*(p+N-1-i);
*(p+N-1-i)=*(p+i);
*(p+i)=t;
} 的时候,函数中的 地址(p+N-1-i)都是非法的

for(i=0;i<N;i++)
scanf("%d",pointer++);
举个例给你说吧:如果一开始pointer指向第一个位置的话,那你的pointer++就永远指向第二个地址,但pointer + i则是指向地i个地址,而你要的是i 个地址,所以