【学习笔记】【C语言】结构体

1.定义结构体变量的3种方式
 1> 先定义类型,再定义变量(分开定义)
 struct Student
 {
    int age;
 };
 struct Student stu;
 
 2> 定义类型的同时定义变量
 struct Student
 {
    int age;
 } stu;
 struct Student stu2;
 
 3> 定义类型的同时定义变量(省略了类型名称)
 struct
 {
    int age;
 } stu;
 
 2.结构体类型的作用域
 1> 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
 2> 定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)

3.代码

1>结构体

 1 /*
 2  数组:只能由多个相同类型的数据构成
 3
 4  结构体:可以由多个不同类型的数据构成
 5  */
 6 #include <stdio.h>
 7
 8 int main()
 9 {
10     //int ages[3] = {[2] = 10, 11, 27};
11
12
13     //int ages[3] = {10, 11, 29};
14
15     // 1.定义结构体类型
16     struct Person
17     { // 里面的3个变量,可以称为是结构体的成员或者属性
18         int age; // 年龄
19         double height; // 身高
20         char *name; // 姓名
21     };
22
23     // 2.根据结构体类型,定义结构体变量
24     struct Person p = {20, 1.55, "jack"};
25     p.age = 30;
26     p.name = "rose";
27
28     printf("age=%d, name=%s, height=%f\n", p.age, p.name, p.height);
29
30     /* 错误写法
31     struct Person p2;
32     p2 = {30, 1.67, "jake"};
33     */
34
35     struct Person p2 = {.height = 1.78, .name="jim", .age=30};
36     //p2.age = 25;
37
38     return 0;
39 }

2>结构体内存分析

 1 #include <stdio.h>
 2 int main()
 3 {
 4
 5
 6     return 0;
 7 }
 8
 9 // 补齐算法
10 void test1()
11 {
12     struct Student
13     {
14         int age;// 4个字节
15
16         char a;
17
18         //char *name; // 8个字节
19     };
20
21     struct Student stu;
22     //stu.age = 20;
23     //stu.name = "jack";
24     // 补齐算法(对齐算法)
25     // 结构体所占用的存储空间 必须是 最大成员字节数的倍数
26
27     int s = sizeof(stu);
28     printf("%d\n", s);
29 }
30
31 // 结构体内存细节
32 void test()
33 {
34     // 1.定义结构体类型(并不会分配存储空间)
35     struct Date
36     {
37         int year;
38         int month;
39         int day;
40     };
41
42     // 2.定义结构体变量(真正分配存储空间)
43     struct Date d1 = {2011, 4, 10};
44
45
46     struct Date d2 = {2012, 8, 9};
47
48     // 会将d1所有成员的值对应地赋值给d2的所有成员
49     d2 = d1;
50     d2.year = 2010;
51
52     printf("%d - %d - %d\n", d1.year, d1.month, d1.day);
53
54     printf("%d - %d - %d\n", d2.year, d2.month, d2.day);
55     /*
56      printf("%p - %p - %p\n", &d1.year, &d1.month, &d1.day);
57
58      int s = sizeof(d1);
59      printf("%d\n", s);
60
61      */
62 }

3>注意点

  1 #include <stdio.h>
  2 // 从这行开始,一直到文件结尾,都是有效(跟全局变量一样)
  3 struct Date
  4 {
  5     int year;
  6     int month;
  7     int day;
  8 };
  9
 10 int a;
 11
 12 void test2()
 13 {
 14     struct Date
 15     {
 16         int year;
 17     };
 18     // 这里使用的是test2函数内部的struct Date类型
 19     struct Date d1 = {2011};
 20
 21
 22     // 结构体类型也是有作用域,从定义类型的那一行开始,一直到代码块结束
 23     struct Person
 24     {
 25         int age;
 26     };
 27
 28     struct Person p;
 29
 30     a  = 10;
 31 }
 32
 33 int main()
 34 {
 35     struct Date d1 = {2009, 8, 9};
 36
 37
 38     test2();
 39
 40     // 不能使用test2函数中定义的类型
 41     // struct Person p2;
 42
 43     return 0;
 44 }
 45
 46 // 定义结构体变量
 47 void test()
 48 {
 49     // 定义结构体变量的第3种方式
 50     struct {
 51         int age;
 52         char *name;
 53     } stu;
 54
 55     struct {
 56         int age;
 57         char *name;
 58     } stu2;
 59
 60
 61     /*结构体类型不能重复定义
 62      struct Student
 63      {
 64      int age;
 65      };
 66
 67      struct Student
 68      {
 69      double height;
 70      };
 71
 72      struct Student stu;
 73      */
 74
 75     /* 错误写法:结构体类型重复定义
 76      struct Student
 77      {
 78      int age;
 79      double height;
 80      char *name;
 81      } stu;
 82
 83      struct Student
 84      {
 85      int age;
 86      double height;
 87      char *name;
 88      } stu2;c
 89      */
 90
 91     /*
 92      这句代码做了两件事情
 93      1.定义结构体类型
 94      2.利用新定义好的类型来定义结构体变量
 95      */
 96     // 定义变量的第2种方式:定义类型的同时定义变量
 97     /*
 98      struct Student
 99      {
100      int age;
101      double height;
102      char *name;
103      } stu;
104
105      struct Student stu2;
106      */
107
108     /*
109      // 定义变量的第1种方式:
110      // 1.类型
111      struct Student
112      {
113      int age;
114      double height;
115      char *name;
116      };
117
118      // 2.变量
119      struct Student stu = {20, 1.78, "jack"};
120      */
121 }
时间: 2024-10-11 22:30:46

【学习笔记】【C语言】结构体的相关文章

学习C/C++语言:结构体,动态链表

//*************************************************************** //结构体:简单的静态链表 #include<stdio.h> #include<string.h> #define NULL 0 #define SIZE 10 struct student { char num[SIZE]; float score; struct student *next; }; void main() { struct stu

C语言学习笔记:22_结构体

/* * 22.结构体.c * * Created on: 2015年7月9日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> /** * 结构体:对共性数据的封装 * 结构体有点使用面向对象的思想,对一类东西的共性进行封闭,以便使用. * * 定义结构体: * //1>定义结构体,也可以定义在函数中(全局与局部的结构体) struct Person{ char *name;// 字符串 int age; d

APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍

以下不少内容来自man手册 结构体struct stat 结构体struct stat用于保存文件相关的所有信息. struct stat的基本成员如下所示 struct stat { dev_t st_dev; // 文件所在设备的设备id,可以分解为主设备号和此设备号 ino_t st_ino; // inode号 mode_t st_mode; // 文件的类型.存取权限等 nlink_t st_nlink; // 文件硬连接数 uid_t st_uid; // 文件拥有者的用户id gi

html5学习笔记(3)--主题结构元素-1

html5学习笔记(3)--主题结构元素-1 Article元素 以下为对应代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <article> <header> <h1>极客学院</h

iOS学习笔记---c语言第九天

高级指针 指向结构体变量的指针,称为结构体指针 可以使用->指向内容. %p打印地址 void pLenth(cPoint *p1,cPoint *p2) //求两点间的距离  用的开方函数sqrt()和平方函数pow(,) { float a = sqrt(pow((p1->x-p2->x), 2)+pow((p1->y-p2->y), 2)); printf("两点距离为%.2f\n",a); } //main.m中代码 #import <Fou

iOS学习笔记---c语言学习第七天

结构体 结构体是一种自定义的数据类型 struct 结构体名 { 类型说明符  成员名: … 类型说明符  成员名: }: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { struct teacher{ char name[30]; char sex; int age; char course[30]; }; typedef struct teacher Teacher; Teacher c

iOS学习笔记---c语言第十天

动态内存分配 一.存储区划分 从低到高(内存地址小----内存地址大)  :  代码区---常量区---静态区---堆区---栈区 栈内存 //凡是在函数体内定义的变量 都存储在栈区(包括形参). int a = 10;//a也是在栈区域里面 float b = 1.5;//b也是在栈区域里面 char c = 'b'; double d = 3.14; printf("%p %p %p %p\n",&a,&b,&c,&d); //栈的特点先进后出,先定

iOS学习笔记---c语言第十一天

函数指针 一.函数指针定义 //函数声明:声明我是一个什么函数 //求两个数的和 //函数的类型:int (int x,int y) //即:我是一个返回值为整型,有两个整型参数的函数. //函数名是 sum int sum(int x,int y); 函数指针定义p是变量,其他是类型(通常没有形参a,b) //函数指针类型 int (*)(int x,int y) //描述:指向 返回值为 int 两个int参数 的 指针类型 //函数指针变量: p //初始值 : sum printf("%

thinkphp学习笔记1—目录结构和命名规则

最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快点,别无他意,所谓活到老,学到老,希望各位不要见笑啊. 我的做法很简单,先从手册开始,手册是开发thinkphp作者辛勤劳动的成果,但是有些地方是在是不懂,如果有幸各位也遇到类似的问题希望能回复.thinkphp手册地址:http://doc.thinkphp.cn/manual.html 1.框架目录 在章节1.6 目录结构,内容如下: 新版的目录结

ios学习笔记---c语言第二天

一.bool布尔类型    c语言没有bool类型,oc里有bool类型 是一种非真即假的数据类型,布尔类型的变量只有yes和no两个值.yes表示表达式是真,no表示表达式是假. 在c语言中认为非0即为真. 分支语句中常用bool值做判断,判断执行if语句还是else语句. 循环结构中,也常使用bool值做判断,判断是否要执行循环. 注意事项: #define yes 1 #define no 0 计算机在识别时,yes就替换成1,no就替换成0. 二.关系运算符 >   >=   <