數據類型
獲取int的字節數大小方法
printf("int bytes:%d",sizeof(int));
列表整理
類型 |
字節數 |
取值範圍 |
char |
1 |
[-128,127]=[-2^7,2^7-1] |
unsigned char |
1 |
[0,255]=[0,2^8-1] |
short int(short) |
2 |
[-2^15, 2^15-1] |
unsigned short int |
2 |
[0,2^16-1] |
int |
4 |
[-2^31,2^31-1] |
unsigned int |
4 |
[0,2^32-1] |
long int |
4 |
[-2^31,2^31-1] |
unsigned long int |
4 |
[0,2^32-1] |
long long int |
8 |
[-2^63, 2^63-1] |
unsigned long long int |
8 |
[0, 2^64-1] |
float |
4 |
-/+3.4e38(精確到6位小數) |
double |
8 |
-/+1.7e308(精確到15位小數) |
long double |
12 |
-/+1.19e4932(精確到18位小數) |
Int 與 long int的區別
早期的C平臺是16位int系統,int用二字節表示,範圍是-32768~+32767;long是long int的簡寫,用4字節表示,範圍是-2147483648~+2147483647。顯然在早期平臺下long能表示的整數範圍要比int大得多。而時下的平臺流行的是32位int系統,即4字節系統,int與long在這樣的系統下已經沒有區別了,它們都是4字節帶符號整數,表數範圍都是-2147483648~+2147483647。
數據溢出
當變量大於類型的最大值或者小於類型的最小值時,該變量的值會進行跳轉,如最大值加一則是最小值。
#include<stdio.h> void main(){ char min=-128-1; char max=127+1; printf("min-1=%d \r\n",min); //輸出: 127 printf("max+1=%d \r\n",max); //輸出: -128 }
靜態變量與函數
只用於本文件的變量或函數要全部使用static關鍵字聲明
靜態變量
0、靜態全局變量僅對當前文件可見,其他文件不可訪問,其他文件可以定義與其同名的變量,兩者互不影響,不可用extern實現誇文件訪問
1、靜態變量會自動賦有初值0,而普通變量編譯器不會自動賦初值
2、局部靜態變量放置在數據區,所以不會因函數的消失而死亡,但寄生於函數之上。全局靜態變量與全局變量類似。
3、靜態變量重複定義時,局部靜態變量優先級高,但只作用於局部
#include<stdio.h> static int i;//全局靜態變量 void fun1(){ static int i;//局部靜態變量 printf("%d\r\n",i);//0-9(局部) i++; } void main(){ int x; for(x=0;x<10;x++) fun1(); printf("---%d\r\n",i);//0(全局) }
靜態函數
0、在函數的返回類型前加上static,就是靜態函數
1、靜態函數只能在聲明它的文件中可見,其他文件不能引用該函數
2、不同的文件可以使用相同名字的靜態函數,互不影響
結構體
聲明
方法1:
struct 結構體名 { 成員列表 }; struct 結構體名 變量1,變量2;
方法2
struct 結構體名 { 成員列表 }變量1,變量2;
方法3
struct { 成員列表 }變量1,變量2;
方法4
typedef struct { 成員列表; }結構體別名; 結構體別名 變量1,變量2;
初始化
方法1
struct { 成員列表 }變量1={成員1值,成員2值,成員3值……};
方法2
memset(&結構體變量名,0,sizeof(結構體變量名)); //將所有全部變量清零
引用(使用)成員:
結構體變量
struct 結構體名 變量1,變量2; 變量1.成員名
結構體指針變量
struct 結構體名 *變量1; 變量1->成員名
C文件間共享變量
extern
extern是計算機語言中的一個關鍵字,可置於變量或者函數前,以表示變量或者函數的定義在別的文件中。提示編譯器遇到此變量或函數時,在其它模塊中尋找其定義,另外,extern也可用來進行鏈接指定。
可以經extern寫在頭文件中,變量的定義寫在任意一個點C文件(如main.c)中,此後只要包含該頭文件夾即可實現變量的共享使用
舉個栗子:
C1.h,聲明函數c1fun()
#ifndef _C1_H_
#define _C1_H_
void c1fun(char *strx);
#endif
C1.c,實現函數c1fun()
#include<stdio.h>
#include"c1.h"
char *wu;
void c1fun(char *strx){
wu=strx;
}
Main.c,調用函數c1fun(),並讀取外部變量wu的值
#include <stdio.h>
#include "c1.h"
extern char *wu;
void main(){
c1fun("123456");
printf("===:%s",wu);//輸出:123456
}
#define
針對不改變的量,可以在頭文件中聲明,在其他c文件中包含即可使用
如c1.h中:
#define DONG "dongxiaodong"
Mian.c中:
#include"c1.h"
……
printf("===:%s",DONG);
……
宏定義的使用
#define的使用
宏定義常量
#define DONG '2' //字符 #define DONG "is str" //字符串 #define DONG 12 //數字 #define DONG 13.36 //浮點數
宏定義範圍
#define P 123 …… #undef P
typedef的使用
宏定義之類型重命名
typedef unsigned char u8;
宏定義之類型重命名對比
#include<stdio.h> #define ch1 char* typedef char* ch2; void main(){ ch1 a,b;//char *a,b; ch2 c,d;//char *c,*d; //輸出: --8,1,8,8-- printf("--%d,%d,%d,%d--",sizeof(a),sizeof(b),sizeof(c),sizeof(d)); }
帶參數的宏定義
#include<stdio.h> #define Max(x,y) ((x>y)?x:y) #define Add(x,y) (x+y); void main(){ int i=Max(10,2); int ii=Add(2,1) //此處無分號 printf("max:%d,add:%d",i,ii);//max:10,add:3 }
參考:
https://blog.csdn.net/xlh006/article/details/81540703
https://blog.csdn.net/kuniqiw/article/details/84495732