首先我们可以回顾数组的赋值问题,在数组中,比如我们定义一个数组arry,里面包含五个×××数:

     int arry[5]={1,2,3,4,5};

声明这个数组后,会为它分配一定内存,而且我们知道arry代表的是数组的首地址。但是如果我们用下面的方法肯定是不行的,如下:

    int arry[5];

    arry={1,2,3,4,5};

有时候我们很容以犯错的是以为给数组arry赋值,但是我们刚刚说过,声明数组arry之后,arry就是数组的首地址,arry就成了一个常量,很显然,常量是不能被赋值的。所以arry={1,2,3,4,5}很显然是错误的。

        对于结构体,可能很多人也会有这个疑问,结构体到底可不可以直接赋值呢?今天自己学习了一下结构体,于是就自己写代码练习,结果遇到问题了!首先我们看一个最简单的结构体程序:

第一种情况:

#include<stdio.h>
int main()
{
 struct point{
  int x;
  int y;
 };

 struct point p1={1,1};
 printf("%d %d\n",p1.x,p1.y);

 return 0;
}

wKiom1XEYYTS9a77AAD7yesFwOA785.jpg

     很显然这样是没问题的,运行的结果如图所示。

     现在把程序改成如下:    

第二种情况:

#include<stdio.h>
#include<math.h>
int main()
{
 struct point{
  int x;
  int y;
 };

 //struct point p1={1,1};
 struct point p1;
 p1.x=1;
 p1.y=2;
 printf("%d %d\n",p1.x,p1.y);
 return 0;
}

这段代码也是没有问题的,运行结果如下所示 :

wKiom1XEYuHjX-rAAAEDj3UHqIg906.jpg

        上面两种情况我们看到,一种是声明一个结构体的时候直接赋值,没有问题,另一种是声明一个结构体变量后给结构体变量中的成员赋值,也是没有问题的!那么还有第三种情况如下:

第三种情况:

#include<stdio.h>
#include<math.h>
int main()
{
 struct point{
  int x;
  int y;
 };

 //struct point p1={1,1};
 struct point p1;

   p1={1,2};
 printf("%d %d\n",p1.x,p1.y);
 return 0;
}

        这种情况下就报错了,编译也不过,在VC++6.0下面提示的编译错误说是少了一个分号。但事实上也不存在少分号的情况,唯一的问题就是结构体不能声明后直接赋值。所以经过验证,结构体也是不能直接给结构体变量赋值的。但是至于是不是跟数组类似呢?是不是意味着结构体变量一经声明也变成了一个变量呢?于是又做如下验证:直接打印结构体变量。

验证一:(验证1看上去打印出来的像是地址常量,所以可能会不能被直接赋值)

wKiom1XEZe6heLajAAFvSq_65vs364.jpg

验证二:(很显然验证二看上去结构体变量p1更像是一个×××变量,难道经过赋值之后的p1和第一个成员变量的值保持一致?

wKioL1XEaJPi99oHAAFRD8dMiCA818.jpg

验证三:(经过第三次验证发现,结构体变量p1的经过赋值后,结构体变量的值惊奇般和结构体中第一个成员变量的值保持一直!)

 wKiom1XEZ8eRpYZ-AAFbJkX9tW8473.jpg

wKioL1XEakmjAhrrAAEhpt5Jx2Y349.jpg

 

        猜测性结论:结构体是可以声明的时候赋值的,也可以通过声明结构体变量之后,再给结构体中的成员变量赋值,但是不能直接给结构体变量赋值;而且一旦赋值成功之后,结构体变量的值竟然和结构体中的第一个成员变量的值保持一直!说明结构体变量又是一个和第一个成员变量类型一直的变量。至于为什么,还有待进一步学习理解!