c语言,二级指针取值加1为什么不能赋值?
#include<stdio.h>#include<stdlib.h>typedefstructstudent{intnum;charname[20];intscore1...
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{
int num;
char name[20];
int score1;
int score2;
int score3;
}stu,*pstu;
void row(pstu *p)//pstu本来就是一级指针,那么定义的p就是二级指针
{
int i,j;
pstu t;//定义一个结构体指针
for(i=4;i>0;i--)
{
for(j=0;j<i;j++)
{
if((*p+j)->num>(*p+j+1)->num)
{
t=*p+j+1;
*p+j+1=*p+j;//为什么这里要报错“表达式必须是可修改的左值“呀
*p+j=t;
}
}
}
}
int main()
{
stu arr[5];
pstu p;
int i;
p=arr;
for(i=0;i<5;i++)
{
scanf("%d%s%d%d%d",&arr[i].num,arr[i].name,&arr[i].score1,&arr[i].score2,&arr[i].score3);
}
row(&p);
for(i=0;i<5;i++)
{
printf("%d%s%d%d%d\n",arr[i].num,arr[i].name,arr[i].score1,arr[i].score2,arr[i].score3);
}
system("pause");
return 0;
} 展开
#include<stdlib.h>
typedef struct student
{
int num;
char name[20];
int score1;
int score2;
int score3;
}stu,*pstu;
void row(pstu *p)//pstu本来就是一级指针,那么定义的p就是二级指针
{
int i,j;
pstu t;//定义一个结构体指针
for(i=4;i>0;i--)
{
for(j=0;j<i;j++)
{
if((*p+j)->num>(*p+j+1)->num)
{
t=*p+j+1;
*p+j+1=*p+j;//为什么这里要报错“表达式必须是可修改的左值“呀
*p+j=t;
}
}
}
}
int main()
{
stu arr[5];
pstu p;
int i;
p=arr;
for(i=0;i<5;i++)
{
scanf("%d%s%d%d%d",&arr[i].num,arr[i].name,&arr[i].score1,&arr[i].score2,&arr[i].score3);
}
row(&p);
for(i=0;i<5;i++)
{
printf("%d%s%d%d%d\n",arr[i].num,arr[i].name,arr[i].score1,arr[i].score2,arr[i].score3);
}
system("pause");
return 0;
} 展开
1个回答
展开全部
你的程序写得不对,这里根本不需要使用二级指针,主函数中的p就是指针。
void row(pstu p)
{
int i,j;
stu t;
for(i=4;i>0;i--)
{
for(j=0;j<i;j++)
{
if((p+j)->num>(p+j+1)->num)
{
t=*(p+j+1);
*(p+j+1)=*(p+j);
*(p+j)=t;
}
}
}
}
主函数调用形式为row(p);
追问
嗯嗯,我知道一级指针做要方便点,但是想通过二级指针解引用冒泡排序修改数组的地址,为什么我的那个程序*p+j不能赋值给*p+j+1呢?很纠结这个问题,谢谢解答
追答
因为左值应该是地址解引用的内容,而不是地址本身。如果使用二级指针,等价的写法应该是:
*t=*(*p+j+i);
*(*p+j+1)=*(*p+j);
*(*p+j)=*t;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询