C语言基础学习(六)

注意:本章笔记有点难,要多看
在这里插入图片描述
局部变量是在 { }定义, 作用范围是定义处到 }。
如果在A{}中的B{}有同名的变量 ,优先使用本{}中的变量
在所有的{ }之外定义的就是全局变量( 静态全局 非静态全局变量)
如果全局变量和静态局部变量没设置初始值, 系统会默认为0 分配在 .bss段
否则就放在.data段
变量的链接类型
无链接: 文件内部链接, 文件外部链接

堆空间 申请 和 释放
申请 malloc calloc realloc
#include <stdlib.h>

   void *malloc(size_t size); 返回值是堆空间的基地址 , 申请空间失败返回值是NULL
   void free(void *ptr);
   void *calloc(size_t nmemb, size_t size); 返回值是堆空间的基地址 , 申请空间失败返回值是NULL
								在申请到空间后,会把里面的数据清零


   void *realloc(void *ptr, size_t size);

int * p = malloc( 10sizeof( int ) ) p 存堆中10int空间的地址

int * p = calloc( 10 , sizeof( int )); 在申请到空间后,会把里面的数据清零
申请到地址值要用一个变量保存,不能丢失,否则使用完该堆空间后,不能释放,会造成内存泄漏
char *p = malloc( 40);
更改
*p = 100;
*(p+i) = 1100;

读值
*p *(p+i)

释放 free
free( p );

清屏 system(“clear”);

realloc
void *realloc(void *ptr, size_t size);
可以进行堆空间的调整
必须已经malloc 或者 calloc之后才能使用realloc,
1:判断 如果新的空间可以继续使用旧地址,则不变更地址,直接变更
2: 如果旧空间地址得“搬迁”, 系统会自动把数据也搬迁过去
但是如果有其它指针已经指向旧地址了,会导致无法访问,因为其它指针不知道新地址

p = malloc / calloc

p = realloc( p , 新的大小); p 就为更新后的堆空间的地址

复合数据类型
结构体:
已知的数据类型 : int char short long int [10]
复合数据类型
可以由开发者自行定义, 里面可以由多种数据类型组成
struct info
{
char name[16] ;
int age ;
char school [256 ];
char tel[12] ;
}; — 定义了一个struct info 类型, 结构体的成员有name age school tel

int a = 0 ; 定义了一个int类型的变量a
a ++;

struct info x ; 定义一个struct info 类型的变量x
x 要访问它里面的成员 x.name x.age x.school x.tel

结构体地址对齐
本成员占用地址空间的大小和后一个成员有关
a: 如果是最后一个成员,
整个结构体中成员基本类型最大为char,那就是以1对齐
整个结构体中成员基本类型最大为short,那就是以2对齐
整个结构体中成员基本类型最大占用空间为4B或者8B,那就是以4对齐
b: 非最后一个成员, 则要看后一个成员的习性
double 以4对齐, 独占2间房
int float long 以4对齐, 独占一间房
short 以2对齐, 占一张床
char 1, 不挑 有一个位置就可以

定义结构体类型
struct info
{
char name[16] ;
int age ;
char school [256 ];
char tel[12] ;
};

定义结构体类型的变量
struct info
{
char name[16] ;
int age ;
char school [256 ];
char tel[12] ;
};
struct info x ; x 是变量

struct info
{
char name[16] ;
int age ;
char school [256 ];
char tel[12] ;
} x ; x 是变量

赋初始值:
struct info
{
char name[16] ;
int age ;
char school [256 ];
char tel[12] ;
};
struct info x = {“zhangsan”, 18, “ABC” , “18912456323” } ; // 容易在版本变更时造成混乱
struct info x = {.name=“zhangsan”, .age= 18, .school =“ABC” , .tel “18912456323” } ;
struct info x = {.name=“zhangsan”, .age= 18};

struct info
{
char name[16] ;
int age ;
char school [256 ];
char tel[12] ;
} x = {.name=“zhangsan”, .age= 18, .school =“ABC” , .tel “18912456323” } ;

结构体变量的使用:
练习: 定义一个结构体,成员有name age tel
要求定义一个结构体类型变量, 从键盘给该变量各个成员赋值,并打印出来

提高: 定义一个结构体类型的数组,数组有3个元素, 给这3个元素的各个成员赋值

练习:
在堆空间申请空间, 给10个学生存储他们的学号、姓名、年龄、生源、成绩
生源 艺术0、体育1 、普通2、
1: struct info
{
int num;
char name[16];
char type;
short score;
};

2:struct info *p = malloc( 10 * sizeof(struct info))
(*p).num = 10;
strcpy(( *p).name , “zhangsan ” )
p -> num 意思同上,先对p进行解引用,再取出它里面的成员 num
p -> num = 10;

p+i 就是访问第i个同学对应的地址

typedef
类型定义 表示类型的别名
int apple ; 定义了一个int类型的变量apple
typedef int apple ; 定义了一个int类型, 类型名是 apple
apple a; ===== > int a;

struct info inf 定义了一个struct info类型的变量inf
typedef struct info inf 定义了一个struct info类型, 类型名是 inf

int *tree ; 表示定义了一个int类型的指针变量a
typedef int *tree ; 表示定义了一个int类型的指针类型tree === int *
tree x, y; 定义两个int *类型变量x , y

int * m , n; 定义一个int 指针类型变量m , 一个int 类型变量n

typedef struct info inf , p_info;
typedef struct info inf ; 定义了一个struct info的类型,类型别名 inf
typedef struct info * p_info 定义了一个struct info
的类型,类型别名p_info

typedef struct info
{
char name[16] ;
int age ;
char school [256 ];
char tel[12] ;
}inf ; inf 就表示 struct info类型

typedef struct info
{
char name[16] ;
int age ;
char school [256 ];
char tel[12] ;
}inf , * p_info;
inf 就表示 struct info类型
p_info 就表示 struct info *类型

联合体、共用体
和结构体的定义、初始化、成员调用方法是一致
union result 联合体类型
{
int yishu ;
char tiyu ;
short putong ;
};
联合体所占的空间为占用空间数最多的成员所对应的字节数, 所有成员的基地址都是一样的

函数传参 , 如果针对不同的要求需要不同的参数
要求1 需要使用的参数是int类型
要求2 需要使用的参数的是char类型
定义一个联合体 ,union info
{
int a ;
char b;
}x;
func(要求 , x )
{
要求为1 , 则选x.a
要求为2 , 则选x.b
}

枚举 是整型值的别名
enum qq
{
putong_type = 0 ,
yishu_type = 1 ,
tiyu_type = 2
};

后一个值如果没有赋值,默认是前一个值+1
如果是第一个值没有赋值,默认为0

.h文件使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章