zoukankan      html  css  js  c++  java
  • c语言基础4

    存储模式: 计算机的存储空间是按照字节寻址的,多字节的数据在存储空间上是连续的,其数据对象的地址等同于其最低位字节的地址。

    例如:int a ;一个 int类型的变量占4个字节,假设变量的地址是0x1000(a),则这个变量所占4个字节的地址分别为:0x1000,0x1001,0x1002,0x1003.将一个整数存储在这个变量中时,哪个字节存在高位那个字节存在低位,根据系统而定,取决于系统的存储模式!

     大端模式(Big Endian):数据的高位存放在低地址字节中,地位存放在高地址字节中。

    小端模式(Little Endian):数据的高位存放在高地址字节中,低位存在低地址字节中。

    写个程序测试一下:

      1 #include<stdio.h>
      2 
      3 /*检测内存是大端模式还是小端模式
      4  *大端模式:顺着输出a,即为:数据的高位在内存的低地址字节中
      5  *小段模式:反着输出a,即为:数据的高位在内存的高地址字节中
      6 */
      7 
      8 
      9 main()
     10 { 
     11         int a;
     12         char *p;
     13         a=0x12345678;
     14         p=(char *)&a;
     15         printf("%#x\n",*p);
     16         printf("%#x\n",*(p=p+1));
     17         printf("%#x\n",*(p=p+1));
     18         printf("%#x\n",*(p=p+1));
     19 }

    输出:

    0x78
    0x56
    0x34
    0x12

    所以是小端模式,数据的低位78,存在内存低地址字节中p开始为低地址。小端模式反着输出!0x12345678,输出78 56 34 12

     结构体: 结构体变量定义时,结构体内的每一个成员都单独占用自己的空间。存在字节对齐问题。

      1 #include<stdio.h>
      2 
      3 struct stp
      4 {
      5         char str[8];
      6         int a;
      7         float f;
      8 };
      9 struct stp st;
     10 struct stp1
     11 {
     12         char str[9];
     13         int a;
     14         float f;
     15 };
     16 struct stp1 st1;
     17 main()
     18 {
     19         printf("%d\n",sizeof(st));
     20         printf("%d\n",sizeof(st1));
     21 }

    输出16,20.
    why??看下面例子:

      1 #include<stdio.h>
      2 /* 结构体字节对齐,满足两个条件:1,成员起始地址%每个成员大小==0,如果
      3 不为0就补空字节,直到该条件满足。2,最后的结构体长度为结构体自身对齐值
      4 的整数倍(自身对齐值为结构体中最长的成员的长度),否则就补空字节*/
      5 
      6 /* 同样的结构体,成员按由大到小排列能够节省空间*/
      7 
      8 
      9 struct TestStruct1
     10 {
     11         char c1;
     12         short s;
     13         char c2;
     14         int i;
     15 }a;
     16 
     17 struct TestStruct2
     18 {
     19         int i; 
     20         short s;
     21         char c2;
     22         char c1;
     23 }b;
     24 
     25 main()
     26 {
     27         printf("%d\n",sizeof(a));
     28         printf("%d\n",sizeof(b));
     29 }

     输出12,8

    共用体:共用体所有成员共用一块内存空间,所以数据成员具有相同的起始地址,所以,某段时间内只有一个成员其作用!按长度最大的成员分配空间。

    例如:

      1 #include<stdio.h>
      2 
      3 union utp
      4 {
      5         char str[5];
      6         int a;
      7         float f;
      8 };
      9 union utp u;
     10 
     11 main()
     12 {
     13         u.a=1;
     14         printf("%c\n",u.str[0]);
     15 }

    输出乱数。共用体元素共用一块地址,a的值为 0000 0000 0000 0001,因此str[0]的值为1的一个字节,是高位字节还是低位字节??根据电脑的存储模式定。若是小端模式:str[0]为0001.低位存在低地址当中。  因此输出0000对应的字符,%d的话输出1.

  • 相关阅读:
    求数组中最大子数组的和(二维环)
    《梦断代码》读书笔记 第3篇
    求数组中最大子数组的和(1000)
    求数组中最大子数组的和(环)
    电梯调度1
    求数组中最大子数组的和(二维)
    读书笔记之反思篇
    二维数组求最大子数组
    结对开发~环形数组篇
    结对开发 ~挑战来了
  • 原文地址:https://www.cnblogs.com/byking/p/2962147.html
Copyright © 2011-2022 走看看