为什么指针不能指向结构体成员的数组?
#include<stdio.h>#definemaxsize100#defineok1#defineerror0typedefstruct{intelem[maxsiz...
#include<stdio.h>
#define maxsize 100
#define ok 1
#define error 0
typedef struct
{
int elem[maxsize];
int last;
}SeqList;
int DelList(SeqList * L,int i,int *e)
{
int k;
if((i<1)||(i>L->last+1))
{
printf("删除位置不合法!\n");
return(error);
}
*e=L->elem[i-1];
for(k=i;k<=L->last;k++)
L->elem[k-1]=L->elem[k];
L->last--;
return(ok);
}
main()
{
SeqList a;
SeqList *M;
int l,j,m;
int *p;
M=&a;
p=M->elem;
a.elem[0]=35;
a.elem[1]=73;
a.elem[2]=-67;
a.elem[3]=23;
a.elem[4]=58;
a.last=4;
for(l=0;l<a.last+1;l++)
printf("%d ",a.elem[l]);
printf("\n");
while(1)
{
printf("请输入删除元素序号:\n");
scanf("%d",&m);
printf("%d",m);
j=DelList(M,m,p);
if(j==ok)
{
printf("操作成功!\n");
break;
}
if(j==error) continue;
}
printf("删除的元素为:\n");
printf("%d\n",*p);
printf("删除后的顺序表为:\n");
for(l=0;l<a.last+1;l++)
printf("%d ",a.elem[l]);
printf("\n");
}
为什么顺序表没有按删除操作后的顺序排列? 展开
#define maxsize 100
#define ok 1
#define error 0
typedef struct
{
int elem[maxsize];
int last;
}SeqList;
int DelList(SeqList * L,int i,int *e)
{
int k;
if((i<1)||(i>L->last+1))
{
printf("删除位置不合法!\n");
return(error);
}
*e=L->elem[i-1];
for(k=i;k<=L->last;k++)
L->elem[k-1]=L->elem[k];
L->last--;
return(ok);
}
main()
{
SeqList a;
SeqList *M;
int l,j,m;
int *p;
M=&a;
p=M->elem;
a.elem[0]=35;
a.elem[1]=73;
a.elem[2]=-67;
a.elem[3]=23;
a.elem[4]=58;
a.last=4;
for(l=0;l<a.last+1;l++)
printf("%d ",a.elem[l]);
printf("\n");
while(1)
{
printf("请输入删除元素序号:\n");
scanf("%d",&m);
printf("%d",m);
j=DelList(M,m,p);
if(j==ok)
{
printf("操作成功!\n");
break;
}
if(j==error) continue;
}
printf("删除的元素为:\n");
printf("%d\n",*p);
printf("删除后的顺序表为:\n");
for(l=0;l<a.last+1;l++)
printf("%d ",a.elem[l]);
printf("\n");
}
为什么顺序表没有按删除操作后的顺序排列? 展开
2个回答
展开全部
#include<stdio.h>
#define maxsize 100
#define ok 1
#define error 0
typedef struct
{
int elem[maxsize];
int last;
} SeqList;
int DelList(SeqList * L,int i,int *e)
{
int k;
if ((i < 1) || (i > L->last + 1))
{
printf("删除位置不合法!\n");
return (error);
}
// 这里你修改了e指向的地址的数。由于e是main函数里面的p,而p即a中的elem,所以*e = *p = elem[0]
// 所以这一句直接就把elem[i-1]的值赋值给了elem[0],由于elem[0]没有事先保存,所以值就丢失了
// 我明白你的意思是想把删掉的数存在p指向的地址对吧,但是p指向的地址就是elem[0]啊,所以没办法直接保存的
// 要么再传进来一个int空间用于存放删除的值?我记得C语言版的《数据结构》里面就是这么干的。
// *e = L->elem[i-1];
for (k = i; k <= L->last; k++)
L->elem[k-1] = L->elem[k];
L->last--;
return (ok);
}
int main()
{
SeqList a;
SeqList *M;
int l, j, m;
int *p;
M = &a;
p = M->elem;
a.elem[0] = 35;
a.elem[1] = 73;
a.elem[2] = -67;
a.elem[3] = 23;
a.elem[4] = 58;
a.last = 4;
for(l = 0; l < a.last + 1; l++)
printf("%d ", a.elem[l]);
printf("\n");
while(1)
{
printf("请输入删除元素序号:\n");
scanf("%d", &m);
printf("%d", m);
j = DelList(M, m, p);
if(j == ok)
{
printf("操作成功!\n");
break;
}
// ok 和 error是对立的,因此不需要这个continue
//if(j == error) continue;
}
// 见删除函数中的注释,这里的*p实际上是a.elem[0]
// printf("删除的元素为:\n");
// printf("%d\n",*p);
printf("删除后的顺序表为:\n");
for(l = 0; l < a.last + 1; l++)
printf("%d ", a.elem[l]);
printf("\n");
// 新加return 0,因为默认的C语言main函数是有返回值的,返回值0表示正常退出
return 0;
}
并不是不能指向数组成员;恰恰相反,就是因为指向了结构体中的数组成员,导致直接修改*p会直接修改结构体中数组的0位置的值,而你要看的又正好是数组的结果,所以当然会发生错误了。
不懂继续追问。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询