struct S
{
int i;
int *p;
};
main()
{
S s;
int *p=&s.i;
p[0]=4;
p[1]=3;
s.p=p;
s.p[1]=1;//执行完该句后s.p指向地址为1的地方,s.p[0]是地址1中存放的内容。所以不能输出s.p[1], //同样也不能对s.p[]赋值
s.p[0]=2;
} -------------------------------------------------------------------- 先看下面的程序
#include<stdio.h>
struct S
{
int i;
int *p;
int j;
};
void main()
{
S s;
int *p=&s.i;
p[0]=4;
p[1]=3;
printf("printf("&s.i=%x\n&p[0]=%x\n&p[1]=%x\n &s.p=%x\n&s.j=%x\n&p=%x\np=%x\n", &s.i,&p[0],&p[1],&s.p,&s.j,&p,p);
}
可以看到&p和&s.p的地址不同,说明这两个p不同,另外s.p存放的值是指向的变量(常量)的地址,而*s.p才是该变量(常量)的值。 在该程序中s.p和p[1]等价,赋值3给s.p或p[1]存放的是地址3,而不是变量3,此时输出*s.p就会出错,因为不能对地址3中存放的内容进行非法访问。而s.i和p[0]等价则是变量。 注:*s.p不是s.p所在地址的内容,而是s.p指向的地址中的内容。s.p[0]和s.p[1]同理。 ------------------------------------------------------------------------------------------------ 故上题中最后一句会出现崩溃,因为s.p[0]中存放的地址