黑马程序员----- c语言结构体

来源:互联网 发布:在知乎回答问题 编辑:程序博客网 时间:2024/04/27 13:43

               ——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-



 结构体存储原理

    结构名只能表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该

变量分配存储空间。

    内存是以字节为单位编号,但一些硬件平台对某些特定类型的数据只能从某些特定地址开始,比如从偶地址开始。若

不按照适合其平台的要求对数据存放进行对齐,会影响到效率。因此,在内存中,各类型的数据是按照一定的规则在内存

中存放的,这就是对齐问题。 


结构体大小的计算方法和步骤

1)将结构体内所有数据成员的长度值相加,记为sum_a;

2)将各数据成员为了内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,记为sum_b。对齐模数是#pragma pack

指定的数值以及该数据

成员自身长度中数值较小者。该数据相对起始位置应该是对齐模式的整数倍;

3)将和sum_b向结构体模数对齐,该模数是#pragma pac指定的数值和结构体内部最大的基本数据类型成员长度中数值较小者。

int main(int argc, const char * argv[]) {    // insert code here...    struct  A    { int a;        char b;        short c;        };    printf (" %zd\n",sizeof (struct A));    return 0;          }

 输出为8  


作用域概述


结构类型定义在函数内部的作用域与局部变量的作用域是相同的
函数外部定义的结构体类型类似全局变量
全局作用域:从定义的那一行开始直到本文件结束为止


作用域分类


结构体根据作用于可以分为全局结构体、局部结构体 

<span style="font-family: SimSun; font-size: 18px;">//定义一个全局结构体,作用域到文件末尾 struct Person{</span>

<span style="font-family:SimSun;font-size:18px;">int age;</span>
<span style="font-family:SimSun;font-size:18px;">char *name; };</span>
<span style="font-family:SimSun;font-size:18px;">void test() {//使用全局的结构体定义结构体变量p </span>
<span style="font-family:SimSun;font-size:18px;"></span>
<span style="font-family:SimSun;font-size:18px;">struct Person p = {10,"sb"}; printf("%d,%s\n",p.age,p.name);</span>
<span style="font-family:SimSun;font-size:18px;">//定义局部结构体名为Person,会屏蔽全局结构体</span>
<span style="font-family:SimSun;font-size:18px;"> //局部结构体作用域,从定义开始到“}”块结束 </span>
<span style="font-family:SimSun;font-size:18px;"></span>
<span style="font-family:SimSun;font-size:18px;">struct Person{int age; };struct Person pp; </span>
<span style="font-family:SimSun;font-size:18px;">pp.age = 50;</span>
<span style="font-family:SimSun;font-size:18px;">// pp.name = "zbz";//局部结构体</span>
<span style="font-family:SimSun;font-size:18px;"></span>
<span style="font-family:SimSun;font-size:18px;"> struct Date{int year; </span>
<span style="font-family:SimSun;font-size:18px;">int month; </span>
<span style="font-family:SimSun;font-size:18px;">int day;};struct Date day = {1999};struct Date day = {1999}; int main(int argc, const char * argv[]){test();return 0; }</span>


结构数组概念

数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下

标结构

变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工

的工资表等。 

定义格式:

struct结构名{

成员表列

}数组名[数组长度]; 

例如:定义一个长度为5的数组,其中每一个元素都是 stu结构类型

struct stu{int num;

char *name;

char sex;

float score;

}boy[5];




结构数组的初始化


  struct stu{

        int age;

    char *name;}; 

1)定义的同时进行初始化

struct stu s[2]={{12,"sb"},{18,"fengjie"}};2)先定义,后初始化,整体赋值

s[1]=(struct stu){23,"xiaoluo"};

3)先定义,后初始化

s[1].age=12;strcpy(stu[1].name, "xxoo"); 





0 0