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文件使用

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