1.構造類型數組
根據已經定義的一個或多個數據類型用構造的方法來定義。函數
分爲:數組、結構體和共用體ui
2.結構體spa
struct 結構體名{指針
成員列表; code
};blog
1)結構體定義完成之後,計算機不會給結構體分配存儲空間three
2)會在定義結構體變量後,分配存儲空間生命週期
struct student stu;//能夠定義多個內存
3)匿名結構體
struct{
char * color;
int age;
}stu1,stu2;
4)結構體中成員的訪問
用點
stu1.age
5)結構體的初始化
// // main.c // 結構體 // // Created by fanyafang on 15/11/5. // Copyright © 2015年 itcast. All rights reserved. // #include <stdio.h> #include <string.h> int main(int argc, const char * argv[]) { //先定義後初始化 struct student{ int age; char name[21]; }stu1,stu2; stu1.age=10; //stu1.name="fffff"; strcpy(stu1.name, "fanffff"); //定義的同時初始化 struct student stu={22,"ddd"}; struct student stu3={.name="ssssssd"}; printf("%s\n",stu1.name); printf("%s\n",stu.name); return 0; }
3.結構體佔用的內存空間是每一個成員佔用的字節數之和(考慮對齊的問題)
計算結構體變量在內存中佔用的字節數的方法
1)先找對齊的模數:是結構體中的基本數據類型中佔用字節數最大的那個
2)在計算結構體變量的各個成員佔用的字節和
4.結構體做用域
全局和局部
5.結構數組
struct student{ int age; char name[21]; }stu[3];
6.結構指針:指向結構體變量的指針
struct student *p=&stu;
訪問方式:(*p).age或者p->age
7.結構體的嵌套:結構體的成員又是另一個結構體變量,不能夠嵌套本身這個類型的變量,但能夠嵌套當前類型的指針
訪問的時候用多個點
8.用結構體變量做爲函數參數:值傳遞
結構體指針做爲函數參數:地址傳遞
9.枚舉
可看作基本數據類型
// // main.c // 枚舉 // // Created by fanyafang on 15/11/5. // Copyright © 2015年 itcast. All rights reserved. // #include <stdio.h> int main(int argc, const char * argv[]) { // //enum Week{one,two,three}; //enum Week week; enum Week{one,two,three}week; week=two; printf("%d\n",week); return 0; }
10.typeof給已經存在的類型取別名
typeof int MALATANG;
MALATANG a=10;
用在數組:
typeof int ARRAY[5];//int a[5];
ARRAY a1={1,2,3,4,5};
用在結構體:
typeof struct person p;
11.預處理指令
以#開頭的指令,宏定義define,文件包含include,條件編譯
宏定義:#define M 5*5+5
1)替換時不加括號
2)字符串中的不會被替換
3)#undef M;//取消宏定義
4)能夠嵌套
5)能夠加參數 #define M(a) a*a+5
要把參數代入替換
6)有參宏傳遞參數的時候最好加括號
12.條件編譯,減小.o文件的大小
#if #else #elif #endif
#ifdef//檢測宏是否認義
#ifndef
13.static延長變量的生命週期
1)static定義局部變量的語句只會被執行一次(放在數據區)
2)static修飾的全局變量只能在當前文件中使用(內部變量)
在不一樣的文件中static能夠聲明相同的變量
3)static修飾的函數是內部函數,只能在當前文件中使用
14.extern
1)不能修飾局部變量
2)extern修飾的全局變量,能夠在其餘文件中使用
extern生命的全局變量在不一樣的文件中不能同名
在使用以前能夠聲明,extern int a;
3)extern修飾的函數能夠在其餘文件中使用
15.文件
ascii文件和二進制文件
頭文件stdio
文件緩衝區,系統自動地在內存中爲每一個正在使用的文件開闢一個文件緩衝區
1)文件指針FILE *fp;
2)文件的打開:fp=fopen("a.txt",'r');打開成功返回首地址,打開失敗返回NULL
3)文件關閉:fclose(fp);正常關閉返回爲0;
4)文件的使用方式
'r' 'w' 'a' 'r+' 'w+' 'a+' 't' 'b'
5)文件輸入輸出函數
fputc(字符,文件指針);
fgetc(文件指針);//指針自動偏移每次讀一個字符
///Users/fanyafang/Library/Developer/Xcode/DerivedData/OC2-fdozqblmcmvpugdcerdoucgzrwvl/Build/Products/Debug/ //文件在這個目錄下找 //寫入和讀取一個字符 FILE *fp=fopen("a.txt", "r"); if(fp!=NULL){ char ch='x'; //fputc(ch,fp); //printf("寫入成功"); ch=fgetc(fp); printf("讀取成功%c",ch); }else{ printf("打開失敗"); } fclose(fp);
//寫入和讀取一個字符串 char ch[]="i love chaina"; FILE *fp=fopen("a.txt", "r+"); if(fp!=NULL){ /* for(int i=0;i<strlen(ch);i++){ fputc(ch[i],fp); } printf("寫入成功"); */ char s=fgetc(fp); while (s!=EOF) { putchar(s); s=fgetc(fp); } printf("讀取成功"); }else{ printf("打開失敗"); } fclose(fp);
fputs(字符串,文件指針);
fgets(字符串,長度,文件指針);遇到\n或者EFO結束,讀一行
//寫入和讀取一個字符 //char ch[]="i love chaina33333sssss"; FILE *fp=fopen("a.txt", "r+"); if(fp!=NULL){ //int count=fputs(ch, fp); //printf("寫入成功,寫入%d個字符",count); char s[100]; fgets(s, 100, fp); printf("%s",s); }else{ printf("打開失敗"); } fclose(fp);
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
//寫入和讀取 char ch[]="i love chaina555555"; FILE *fp=fopen("a.txt", "r+");//wb寫入二進制文件 if(fp!=NULL){ fwrite(ch, strlen(ch), 1, fp); printf("寫入成功"); rewind(fp);//文件指針再指到開始位置 char s[100]; fread(s, sizeof(s), 1,fp); printf("%s",s); }else{ printf("打開失敗"); } fclose(fp);
fprintf(fp,"%d#%d",a,b);
fscanf(fp,"%d#%d",&a,&b);
文件的隨機讀寫
rewind(文件指針);//將指針移到文件首
fseek(文件指針,位移量,起始點);//將指針從起始點移動,通常用於讀寫二進制文件
起始點0SEEK_SET,1SEEK_CUR,2SEEK_END
feof(文件指針);//檢測文件是否到末尾
ferror(文件指針);//判斷是否讀取錯誤
clearerror(文件指針);//清楚出錯標誌