结构体学习要点
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);
}
注意:当使用变量访问结构体成员时,使用成员操作符.
当使用指针访问结构体成员时,使用->
一、结构体的定义
编程时,用一个变量名指代一组数据很方便。结构体能够存储多个多种类型的数据,同时用一个变量名来表示,这使程序修改很方便,因为设计紧凑。
结构体用在有大量数据被一起存储的情况,它们可以存储数据库的数据或者家庭联系薄上的信息,此时,一个结构体可以存储联系人姓名,家庭地址,电话号码等等。
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);
}
注意:当使用变量访问结构体成员时,使用成员操作符.
当使用指针访问结构体成员时,使用->
相关文章推荐
- HotSpot虚拟机对象揭秘之对象的创建过程探究
- 蛤玮买好了礼物
- 罪犯转移
- iOS之远程通知使用介绍
- hdu 3006(状态压缩)
- Groovy入门(三)——集合类型List
- Android中LoaderManager:AsyncTaskLoader和CursorLoader的使用
- SEO分析:都是流量惹的祸
- Intent的带对象传值
- 单例模式
- Groovy入门(二)——集合类型-Range
- 【NOIP2015模拟11.3】备用钥匙
- WEB网站常见的受攻击方式及预防手段
- LoadTypeLibEx
- spoj 16891 Character Patterns (Act 8)
- java内存区域与内存溢出异常
- 块级元素和内联元素区别
- android studio 签名并打包
- unity性能分析
- Messenger的基本用法(本质是跨APP的绑定服务)