鱼C论坛

 找回密码
 立即注册
查看: 1803|回复: 0

[技术交流] 来谈谈为什么数组与数组之间不能直接赋值,而结构体和单个类型都可以呢

[复制链接]
发表于 2017-2-10 00:11:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 qq1242009750 于 2017-12-1 21:36 编辑

大家好,我又来了 嘻嘻;今天我们就来谈谈数组于数组之间为什么不能直接赋值把 哈哈

我们都知道数组(int a[20])和 单个类型(int a)如何创建了.

数组
  1. int a[20]
复制代码


单个类型
  1. int a
复制代码


好知道了如何创建后我们来看一下以下的代码
  1. int Arr[10] = {1,2,3,4,5,6,7,8,9,0};
  2. int Arr1[10];

  3. Arr1 = Arr
复制代码

哈哈,想必大家都知道 ,这个代码肯定会报错,

报错:做操作位数必须为左值.

同样我们这么做也会报错
  1. Arr1++;
复制代码

而且报的是相同的错误

也就是说Arr1是一个常量,而Arr1同时也是数组的首地址,所以我们可以认为 Arr1 于 常量指针很相似,是一个不可以被改变的地址.

我们还知道int类型是占4个内存单元的,也就是说int的传输是4个内存单元,
当然我们也知道Arr1 和 Arr都是int类型而且占的内存单元是一样的 40个 ,如果你说一次性传输40个内存单元是不是有点不符合逻辑呢?



好再来看一下代码
  1. int i = 5;
  2. int b;

  3. b = i;
复制代码


这个代码,没有报错,好吧,那么我们这样子来试试
  1. i++;
复制代码


Y49AZ9)U~`RH~R){HQ[5$B6.png

咦!这样也没有报错嘢!这样的话我们可以推断出一下的结论:

图上我们可以看出i被当作了偏移地址
i是一个变量,也是5的地址,这个东西既是变量又是地址   ,,,  我们联想到了 指针..
也就是说这个 i  于 指针很相似.


好了 ,到结构体了,
那......什么是结构体呢??
结构体就是可以包含任意多种类型的类型。
PS:结构体本身就是一种类型.

结构体的定义如下:
  1. struct MyStruct
  2. {
  3.         int a[2];
  4. };
复制代码

结构体都写出来了,大家也不妨来猜一猜这个结构体的大小吧......
这里不写出答案,只写出这个:
  1. sizeof(struct MyStrcur);
复制代码


好,我们来看一下的代码
  1. #include <stdio.h>

  2. struct MyStruct
  3. {
  4.         int a[2];
  5. };

  6. int main(void)
  7. {
  8.         struct MyStruct Stu1,Stu2;
  9.         Stu1 = Stu2;
  10.        
  11.         getchar();
  12.         return 0;
  13. }
复制代码

好,代码不会报错 哈哈哈哈...

是不是有很多朋友们都会有这样的疑问呢?
为什么结构体就能直接赋值呢?

下面给你来揭晓:
)4AJHEHBX{C]FIJF~LLLBJ5.png

哈哈 看到了把,Stu2 的内容直接赋值给 Stu1

再来看一下:
  1. Stu1++;
复制代码


咿呀!报错了  .... 无效,Stu1是一个实体!!
这个怎么解释呢?

其实也很简单:因为我们定义结构体的时候在结构体里面还定义了一个 int 类型的数组,如果Stu1++了,就对齐不到int 数组的内存了
,所以结构体只能
这样:
  1. Stu1 = Stu2;
复制代码




分析完了................  不足之处请大家多多指出..




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 23:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表