为什么指针不能指向结构体成员的数组?

#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");
}
为什么顺序表没有按删除操作后的顺序排列?
展开
 我来答
无声的硝烟
2016-12-03 · TA获得超过593个赞
知道小有建树答主
回答量:360
采纳率:77%
帮助的人:146万
展开全部
#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位置的值,而你要看的又正好是数组的结果,所以当然会发生错误了。

不懂继续追问。

百度网友2018359
2016-11-26 · TA获得超过3494个赞
知道大有可为答主
回答量:3486
采纳率:73%
帮助的人:1441万
展开全部
为什么指针不能指向结构体成员的数组?
--------------------------
可以
更多追问追答
追问
可以吗?求指教。
追答
怎么不能的,你举个例看看
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式