ch07 复合类型

Overview C语言中复合类型 (composite type) 是指用户自定义类型,通常由多种元素组成的类型,其元素被紧密存储在内存中。C语言常见的复合类型有: 数组 字符串 结构体 联合类型 结构体 [1] 结构体 (structure) 是指用户定义的数据类型,允许将不同类型的多个元素组合在一起,来创建出更复杂的数据类型,类似于数组,但又区别于数组,数组只能保存同类型的元素,而结构体可以保存不同类型的元素。 定义 声明结构体的语法如下 c 1 2 3 4 5 6 struct structureName { dataType memberVariable1; datatype memberVariable2; ... } variable01, variable02...; 这里需要注意的一些地方: struct是关键字,structureName定义的新数据类型,variable{}是作为使用 structureName 声明的新变量名 每个成员方法结尾都是 “;" 而不是逗号 ”," 结构体不能递归 变量可以有多个 例如声明一个学生的结构体,而student是作为一个新的数据类型存在 c 1 2 3 4 5 6 struct student { char name[20]; int roll; char gender; }; Notes:在定义(创建)结构体变量前,结构体成员不会占用内存 声明 使用结构体声明变量 也可以一次性定义结构体和声明变量 c 1 2 3 4 5 6 7 8 9 10 11 12 13 struct student { char name[20]; int roll; char gender; } stu1,stu2; // 结构体名称可以省略 struct { char name[20]; int roll; char gender; } stu1,stu2; 赋值 在声明结构体后,student结构体只是自定义数据结构,要使用还需要进行初始化,或者赋值...

 ·  · 

ch06 内存布局

Overview 在编写程序时包含任意指令如,已初始化和未初始化数据,局部变量,函数等都是用于动态分配内存的指令。当程序编译后(默认生成 x.out 文件)这是一个可执行的链接文件( Executable and linking format)。在执行时这些不组织成几部分,包含不同的内存分段 (segments) ELF:这是系统中标准二进制格式,其一些功能包含,动态链接,动态加载,对程序运行时控制。 可以使用 size {ELF_file} 查看被分配的每个段的大小(Linux操作系统); dec 列给出的是这个程序 text + data + bss 段的总大小,用十进制表示 text 段是存储可执行命令的段 data 段包含所有初始化数据,全局与静态变量 BSS 段包含未初始化数据 bash 1 2 3 $ size 1 text data bss dec hex filename 1843 584 8 2435 983 1 Memory Layout in C [1] 在C语言中内存布局模型包含六个部分 命令行参数 (Command Line Arguments) 栈 (Stack) 堆 (Heap) 未初始化数据段 (Uninitialized Data Segment BSS) 已初始化数据段 (Initialized Data Segment) 文本/代码段 (Text/Code Segment) 这6部分结构可以再划分为两种类型:...

 ·  · 

ch05 指针

指针 指针声明 [1] 指针/指针变量 (pointer) 是用于存储地址的变量 使用 & 运算符 来访问变量的地址。例如 c 1 2 3 4 5 6 7 #include <stdio.h> void main() { int a = 100; printf("%x", &a); } 输出结果为 16进制的内存地址 c 1 61fe1c 使用地址运算符 * 可以从变量地址中获取变量的值,这个行为被称为间接引用/解引用(indirection/dereferencing)。例如: c 1 2 3 4 5 6 7 8 9 #include <stdio.h> void main() { int a = 100; printf("%d", *(&a)); // 也可以写为,因为*与&优先级相同,从右到左的顺序,所以有没有()意思是相同的 printf("%d", *&a); } 输出结果为 100 指针变量 指针变量是指存储一个变量的地址的变量,可以使用符号 * 来修饰变量,定义语法为:...

 ·  · 

ch04 函数

concept [1] 函数 (function) 是执行任务的语句块。 函数的作用: 提高代码的可重用性并减少冗余 代码模块化 代码易读性 使代码模块化 函数的分类 C语言中有两种类型的函数: 标准库函数:C中的内置函数,在头文件中定义 #include <stdio.h> 用户自定义函数:用户自定义的函数 #include "stdio.h" 函数三部曲 C语言中函数分为三个方面,声明(declaration),定义(defining),调用(calling) 声明 声明是让编译器知道函数的名称、参数信息、参数的返回值的类型。 c 1 (type) function_name({type args...}); 隐式声明(implicit) :当在main之后定义的函数而未声明,默认编译器会做隐式声明。 ISO/IEC 9899:1990 中 关于函数声明的部分: 函数在调用前必须有一个可用的声明,如果没有被声明,则该函数默认被隐式声明,该隐式声明没有参数,返回值为int [2] 定义 C中函数定义的语法如下 c 1 2 3 4 return_type function_name(arg1, arg2, ... argn) { function body // 函数中要处理任务的逻辑 } return_type:函数返回值的数据类型 function_name:函数名 arg1, arg2, …argn:参数列表(可选),定义传递给函数的数据类型、顺序和参数的数量。 function body:调用函数时任务处理和执行的语句 调用 调用是指要由编译器执行的函数,可以在任何部分调用 虚函数void 如果函数没有返回值,则使用关键字 void,主要用于两个方面: 打印具体信息供用户阅读的函数 引用参数,函数通常不是用于返回一个内容,而是修改引用参数的,无需返回值 void 关键字使用注意: void仅用于限定函数返回值,函数参数,不可以修饰变量,因为无法对无类型的变量分配指针...

 ·  · 

ch03 数组

Array [1] 数组是由单个元素组成的一组数据类型的变量 数组的元素存储在连续的内存位置 声明数组时应提及数组的大小 数组的计数从0开始 数组为一位数组与多维数组 数组首元素的地址与数组地址相同 数组包含 int, float, char, double 数据类型 Declaration and Initialization 表达式 说明 int my_array1[20]; 指定大小,来声明一个有20个元素的int数组 char my_array2[5]; 指定大小,来声明一个有5个元素的char数组 int my_array[] = {100, 200, 300, 400, 500} 声明时初始化一个数组(编译器自动求数组元素个数) int my_array1[5] = {100, 200, 300, 400, 500}; 声明时初始化 int my_array2[5] = {100, 200, 300}; 声明时初始化(剩余未初始化的元素,默认 0 值) int my_array2[5] = {0}; 声明时初始化(声明一个全0值的数组) int arr[10]; arr[0] = 5;arr[1] = 6;arr[2] = 7; 声明数组并初始化值(这种方法为初始化部分的默认值为随机数) char str[] = “zhangsan” 声明一个字符串(字符串是一个char类型数组) Advantages and Disadvantages 缺点**:大小限制**:声明(定义)后是固定的大小,不能通过运行时改变其大小...

 ·  ·