您的位置:首页 > 其它

结构体学习要点

2016-04-18 20:42 267 查看
在手机app上看到一个老外写的英文的关于结构体的文章,自己就按照自己的理解意译了一遍,写下来和大家共同学习。老外还是写的清晰可读,大家好好学习下,特别是结构体内存分配和内存对齐问题是其重点。

一、结构体的定义

编程时,用一个变量名指代一组数据很方便。结构体能够存储多个多种类型的数据,同时用一个变量名来表示,这使程序修改很方便,因为设计紧凑。

结构体用在有大量数据被一起存储的情况,它们可以存储数据库的数据或者家庭联系薄上的信息,此时,一个结构体可以存储联系人姓名,家庭地址,电话号码等等。

 struct  <name_tag>

{

  ....

}<more_tags>;

 

结构体的tag是可有可无的,每个成员都是正常的变量定义,如int i; float f;或者其它任何有效变量定义。

在结构体定义结尾,最后一个分号之前,你可以确定一个 或者多个结构体变量名,但是它是可有可无的,这里用Book结构体示例:

 struct Books

{

 char title[50];

 char author[50];

 char subject[50];

 int  bookid[50];

}books;

 

二、访问结构体成员

访问结构体的任何成员,我们都用成员操作符. ,成员操作符.放在结构体变量名和我们想要访问的成员变量名之间,示例:

 

#include <stdio.h>

#include <stdlib.h>

#include<string.h>

 struct Books

{

  char title[50];

  char author[50];

  char subject[50];

  int  bookid;

};

 

 

main()



       struct Books book1; //定义Book型变量book1

       struct Books book2; //定义Book型变量book2

      

       /*变量book1具体定义 */

       strcpy(book1.title,"Cprograming");

      strcpy(book1.author,"K&R");

      strcpy(book1.subject,"C programing Tural");

       book1.bookid =12345;

      

      

       /*变量book2具体定义 */

       strcpy(book2.title,"Ctest");

       strcpy(book2.author,"yanqian");

      strcpy(book2.subject,"C programing books");

       book2.bookid =8889;

      

       /*打印book1信息*/

       printf("book1title:%s\n", book1.title);

       printf("book1title:%s\n", book1.author);

       printf("book1title:%s\n", book1.subject);

       printf("book1title:%d\n", book1.bookid);

      

       /*打印book2信息*/

       printf("book2title:%s\n", book2.title);

       printf("book2title:%s\n", book2.author);

       printf("book2title:%s\n", book2.subject);

       printf("book2title:%d\n", book2.bookid);

       system("pause");

}

 

三、结构体作为函数参数(传值)

 

对上面代码进行优化,使用函数来打印信息,结构体作为参数

#include <stdio.h>

#include <stdlib.h>

#include<string.h>

 struct Books

{

  char title[50];

  char author[50];

  char subject[50];

  int  bookid;

};

 

//函数声明

void  printBook(struct Booksbook);

 

main()



       struct Books book1; //定义Book型变量book1

       struct Books book2; //定义Book型变量book2

      

       /*变量book1具体定义 */

       strcpy(book1.title,"Cprograming");

      strcpy(book1.author,"K&R");

      strcpy(book1.subject,"C programing Tural");

       book1.bookid =12345;

      

      

       /*变量book2具体定义 */

       strcpy(book2.title,"Ctest");

      strcpy(book2.author,"yanqian");

      strcpy(book2.subject,"C programing books");

       book2.bookid =8889;

      

       /*打印book1信息*/

       printBook(book1);

       /*打印book2信息*/

       printBook(book2);

       system("pause");

}

 

void printBook(struct Books book)

{

      printf("booktitle:%s\n", book.title);

       printf("book title:%s\n",book.author);

       printf("booktitle:%s\n", book.subject);

       printf("booktitle:%d\n", book.bookid);

}

四、结构体指针(传址)

 

由于当结构体作为参数时,结构体对象复制到栈区,大大增加内存中栈的消耗,因此当使用结构体指针时,仅仅传一个4字节的地址指针即可(所有地址指针都是4字节的)

#include <stdio.h>

#include <stdlib.h>

#include<string.h>

 struct Books

{

  char title[50];

  char author[50];

  char subject[50];

  int  bookid;

};

 

//函数声明

void  printBook(struct Books*book);

 

main()



       struct Books book1; //定义Book型变量book1

       struct Books book2; //定义Book型变量book2

      

       /*变量book1具体定义 */

       strcpy(book1.title,"Cprograming");

      strcpy(book1.author,"K&R");

      strcpy(book1.subject,"C programing Tural");

       book1.bookid =12345;

      

      

       /*变量book2具体定义 */

       strcpy(book2.title,"Ctest");

       strcpy(book2.author,"yanqian");

      strcpy(book2.subject,"C programing books");

       book2.bookid =8889;

      

       /*打印book1信息 传变量地址*/

       printBook(&book1);

       /*打印book2信息 传变量地址*/

       printBook(&book2);

       system("pause");

}

 

void printBook(struct Books *book)

{

      printf("booktitle:%s\n", book->title);

       printf("booktitle:%s\n", book->author);

       printf("booktitle:%s\n", book->subject);

       printf("booktitle:%d\n", book->bookid);

}

 

 

注意:当使用变量访问结构体成员时,使用成员操作符.

            当使用指针访问结构体成员时,使用->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: