c语言结构体

结构体:  用来处理,现实生活中,更复杂的数据的描述        

             用来 描述复杂数据的 一种用户自定义的数据类型

//结构体类型 定义  --- 定义(从无到有) 声明()

一、定义

struct 结构体名
{
	成员列表
};

(1)   struct    表示 这是一个结构体类型

(2)   结构体名  标识符

(3)   成员列表  这个结构类型中要描述的具体数据              

                    一般,都是变量定义的形式

eg:

struct student 
{
	int sno;
    char name[20];
	int age;
	float score;
}; //此时 表示 定义了一个 学生信息 的 结构体类型 
   //数据类型 --- 用户自定义 

(一)初始化

struct student   s = {110,"tom",18,98.5}; 

(二)引用

       一般,我们是引用到结构体成员 (引用到这种基本类型)

    .      //结构体成员运算符 

      eg:

         结构体变量名.结构体成员变量名

 s.sno
   s.name
   s.age
   s.score  //引用到结构体成员变量 

说明:   1. 同一类型的结构体 变量间 可以相互赋值  

              2. 结构体变量赋值,是赋值给 结构体成员的

二、结构体的大小

结构体的对齐规则: //内存地址的对齐
1.在32位的平台上,默认都是按4字节对齐的。 
2.对于成员变量,
   各自在自己的自然边界上对齐。
   char  -- 1字节 
   short -- 2字节   
   int   -- 4字节  
3.如果 成员变量中有比4字节大。      
  此时 整个结构体 按照4字节对齐。 //32位的平台 


4.如果 成员变量中没有有比4字节大。  
  此时 整个结构体 按照最大的那个成员对齐。
  
  //32位的平台   
  //如果有超过4字节 ,按照4字节对齐
  //如果没有超过4字节的,则按成员变量中最大对齐 
 ----------------------------------------------
  //64位的平台  ---- 64位平台 整个结构体对齐, 按成员中最大的对齐   

  1.结构体成员的对齐 --- 放在自然边界 (偶数位置)
  2.结构体整体的对齐 --- 以结构体中最大的成员对齐 

typedef struct {
    int a;
    double b;
    short c;
}A;  //sizeof(A)=24
typedef struct {
    int a;
    short b;
    double c;
}B;  //sizeof(B)=16

    

思考:

  1.什么是内存对齐,为什么需要内存对齐?

答:

1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

    2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

   注意:


   (一)结构体类型的定义 


     可以在全局
     可以在局部

   (二)使用方式 

      1. 先定义结构体类型 再定义变量名     
struct student   

   {   

     ...   

   }; //定义了类型              struct student s; //定义了变量

     2. 定义类型的同时定义变量 
struct student 
	  { 
	    ... 
	  }s={...}; //定义了类型 
    3. 定义类型的同时定义变量 ,结构体名省略
struct 
	  { 
	    ... 
	  }s={...}; //定义了类型 


   //如果该结构体仅仅在你的代码中使用一次,就可以这么定义

三、堆函数

 //堆区 --- 空间很大,但是需要手动申请,手动释放 

(一)void *malloc(size_t size);

       功能:           从堆区申请一块内存空间    

       参数:          @size ---说明,要申请的空间的大小       

       返回值:         void *  返回申请到的空间的地址

(二) void free(void *ptr); //释放函数 

       功能:
            释放堆区空间 
        参数:
          pstr  //必须是 之前 申请到的堆区内存空间的地址

#include
#include

int main(int argc, const char *argv[])
{
	int * p = malloc(sizeof(int));

	*p = 10;

	printf("*p = %d\n",*p);

	printf("%p\n",p);

	free(p);

	p = NULL;

	printf("%p\n",p);
	return 0;
}

c语言结构体_第1张图片

(三)注意

          1.free本身表示将空间释放,就是将空间交还给操作系统,操作系统之后,可以自由安排 
          2.注意:
            free 并不会将释放的空间上的数据清零 
          3.不能对同一块空间多次free 
          4.释放掉之后的,空间,不要在使用了
            一般将对应的指针变量设置为NULL 
           //(悬空指针) 
 

四、应用

   在堆区申请空间存放结构体

#include
#include
#include


struct Student{
	char name[50];
	int age;
	char gender[10];
	float grade;
};



int main(int argc, const char *argv[])
{
	struct Student *s = malloc(sizeof(struct Student));

	strcpy(s->name,"tom");
	s->age = 18;
	strcpy(s->gender,"man");
	s->grade = 96.5;

	printf(" %s\t", s->name);
	printf("%d\t", s->age);
	printf("%s\t", s->gender);
	printf("%.1f\n", s->grade);


	return 0;
}

你可能感兴趣的:(c语言,开发语言)