摘要:局部變量的作用域是變量所在的局部范圍。生命周期變量的生命周期變量的創(chuàng)建和銷毀之間的時間段局部變量的生命周期進入作用域生命周期開始,出作用域生命周期結(jié)束。
就在前幾天,C語言入門到進階部分的專欄——《維生素C語言》終于完成了。全文共計十八個章節(jié)并附帶三張筆試練習篇,美中不足的是,第一章和第二章是以截圖形式展現(xiàn)的。由于本人一開始是在有道云筆記上寫的初稿,當時想方便省事(有道云排版?zhèn)€人感覺確實比較美觀)就直接以截圖的形式完成了第一章和第二章。本人考慮到因為是截圖,不能復(fù)制文中出現(xiàn)的代碼,不方便讀者進行復(fù)制粘貼,所以我打算重新寫一下第一章和第一章的內(nèi)容,并且重新進行了排版。
本章從如何寫主函數(shù)開始講起,對C語言基礎(chǔ)知識點進行蜻蜓點水地介紹,想看詳細講解教學(xué)請訂閱專欄!專欄連接:《維生素C語言》
? 何為main函數(shù)?
main函數(shù),又稱主函數(shù),是程序執(zhí)行的起點。
1. 主函數(shù)是程序的入口
2. 主函數(shù)有且只有一個
? 一個工程中可以有多個“.c文件”,但是多個“.c文件”中只能有一個“main 函數(shù)”
?? "你好,世界!"
#include //頭文件int main(){ printf("hello world!/n"); return 0;}
? 編譯 + 鏈接 + 運行代碼
快捷鍵: Ctrl + F5( VS2013 )
[調(diào)試] -> [選擇" 開始執(zhí)行(不調(diào)試)"]
? “是不是有什么一閃而過了?”
因為程序執(zhí)行得太快,所以沒有看到結(jié)果。
為了看到結(jié)果,我們需要設(shè)置一下 VS2013 的屬性 ( VS2019不需要設(shè)置項目屬性 )
[解決方案資源管理器] -> [右鍵項目名稱] -> [屬性] -> [鏈接器] -> [系統(tǒng)]-> [子系統(tǒng)] -> [選擇" 控制臺(/SUBSYSRTEM:CONSOLE) "]
? 運行結(jié)果如下:
? 這里先做些簡單的介紹:
? 基本數(shù)據(jù)類型的使用方法:
int main(void){ char ch = "a"; int age = 20; float weight = 50.8; double d = 0.0; return 0;}
? 格式說明由“%”和格式字符組成:
? 演示:
int main(){ printf("%d/n", 100); printf("%c/n", "a"); float foo = 5.0; printf("%f/n", foo); double pi = 3.14; printf("%.2lf/n", pi); // .xf(x為小數(shù)點保留幾位數(shù)) char str1[] = "hello"; printf("%s/n", str1); int a = 10; printf("%p/n", &a); return 0;}
? 運行結(jié)果: 100 a 5.000000 3.14 hello 0000000000061FE04
? 32位系統(tǒng)下:
? sizeof 函數(shù):獲取數(shù)據(jù)在內(nèi)存中所占用的存儲空間,以字節(jié)為單位計數(shù)
? 使用方法演示:
int main(void){ char a = "A"; printf("%d/n", sizeof(a)) printf("%d/n", sizeof a) //求變量時可省略括號 ? printf("%d/n", sizeof(char)); printf("%d/n", sizeof char); //error!但是求字符類型時不可省略 ? return 0;}
? 運行結(jié)果:1
? 使用 sizeof 求元素個數(shù):
int main(void){ int arr[] = {1,2,3,4,5,6,7,8,9,10}; printf("%d/n", sizeof(arr)); //計算的是數(shù)組的總大小,單位是字節(jié) printf("%d/n", sizeof(arr[0])); //計算的是數(shù)組首字符大小 int sz = sizeof(arr) / sizeof(arr[0]); printf("%d/n", sz); return 0;}
? 運行結(jié)果: 40? 4? 10
? 計算機中的單位: bit - 比特位
計算機中識別二進制:1&0???????? 8進制:0-7??????? 10進制:0-9
?
?? 代碼演示:
#include int main(void){ int age = 20; double weight = 62.5; age = age + 1; weight = weight - 10; printf("%d/n", age); printf("%lf/n", weight); return 0;}
?
?
? 局部變量和全局變量的名字相同時,局部變量優(yōu)先,對局部影響:
int var = 100;int main(void){ int var = 10; printf("%d/n", var); return 0;}
? 運行結(jié)果: 10
?
? 使用方法演示:
int main(void){ int a = 0; scanf("%d", &a); printf("%d", a); return 0;}
? 使用方法演示:寫一個代碼求兩個變量的和
int main(void){ int a = 0; int b = 0; int sum = 0; scanf("%d %d", &a, &b); sum = a + b; printf("sum = %d/n", sum); return 0;}
? 如果編譯器發(fā)出了警告,說 scanf 不安全,在代碼前面添加
#define _CRT_SECURE_NO_WANRINGS 1
即可,當然還有其他方法可以解決,這里就不細說了。
?
? 運行結(jié)果如下:(假設(shè)輸入了 1 2)
sum = 3
? 作用域(scope)
程序設(shè)計概念,通常來說,一段程序代碼中所用到的名字并不總是有效/可用 的 而限定這個名字的可用性的代碼范圍就是這個名字的作用域。
全局變量的作用域是整個工程。
局部變量的作用域是變量所在的局部范圍。
? 生命周期:
變量的生命周期:變量的創(chuàng)建和銷毀之間的時間段
局部變量的生命周期:進入作用域生命周期開始,出作用域生命周期結(jié)束。
全局變量的生命周期:整個程序的生命周期。
? 局部變量的生命周期:
int main(){ { int a = 10; printf("%d/n", a); } printf("%d/n", a); //error 生命周期結(jié)束了}
? 全局變量的生命周期
//聲明一下變量extern int g_val;int main(){ printf("%d", g_val);}
? 定義:C語言中常量和變量的定義的形式有所差異
C語言的常量分為以下幾種:
① 字面常量:直接寫
② const 修飾的常變量:用 const 定義
③ #define 定義的標識符常量:宏定義
④ 枚舉常量:可以一一列舉的常量
? 字面常量:
int main(void){ 3.14; 10; "a"; "abcdef";}
? const 修飾的常量:
int main(void){ const int num = 10; num = 20; //error, 不能修改 printf("num = %d/n", num);}
? 運行結(jié)果: 10
? #define 定義的標識符常量:
#define MAX 10000 // 不寫=,不加分號!int main(void){ int n = MAX; printf("%d/n", n);}
? 運行結(jié)果:10000
? 枚舉常量:
//性別enum Sex { //這種枚舉類型的變量的未來可能取值 //枚舉常量 MALE = 3, //賦初值 FEMALE, SECRET};int main(void){ enum Sex s = MALE; printf("%d/n", MALE); // MALE = 3 error 不可修改 printf("%d/n", FEMALE); printf("%d/n", SECRET); return 0;}
? 注意事項:
const 只是一個有常屬性的變量,本質(zhì)上仍然為變量!arr[], 數(shù)組的大小必須是常量!
int main(){ const int n = 10; //n是變量,但是又有常屬性,所以我們說n是常變量 int arr[n] = {0}; // 仍然不可以,因為n是變量,只是有常屬性而已 return 0;}
? #define 定義的可以,宏定義用得最多的地方是在數(shù)組中用于指定數(shù)組的長度:
#define N 10int main(){ int arr[N] = {0}; return 0;}
? 注意事項:
枚舉常量雖然是不能改變的,但是通過枚舉常量創(chuàng)造出來的變量是可以改變的!
enum Color { // 枚舉常量 RED, YEELOW, BULE};int main(void){ enum Color c = BULE; //我們創(chuàng)建一個變量c,并將BULE賦給它 c = YEELOW; //這時將YEELOW賦給它,完全沒有問題 ? BULE = 6; //error!枚舉常量是不能改變的 ? return 0;}
? 定義:
"hello?world."
這種由雙引號(Double Quote)引起來的一串字符稱為字符串字面值(String Literal)
? 關(guān)于斜杠零:
字符串的結(jié)束標志是一個 /0 轉(zhuǎn)義字符。
在計算字符串長度的時候 /0 是結(jié)束標志,不算字符串的內(nèi)容!
? 下面代碼,打印的結(jié)果是什么?為什么?
int main(void){ char arr1[] = "abc"; //數(shù)組 // "abc" -- "a" "b" "c" "/0" // 這里面,"/0" 字符串的結(jié)束標志 char arr2[] = {"a", "b", "c"}; char arr3[] = {"a", "b", "c", "/0"}; printf("%s/n", arr1); printf("%s/n", arr2); printf("%s/n", arr3); return 0;}
? 打印結(jié)果如下:
?
? strlen 函數(shù):返回字符串的長度
? 使用時需引入頭文件
?
? 代碼演示:
#include #include int main(){ char arr1[] = "abc"; char arr2[] = {"a", "b", "c"}; printf("%d/n", strlen(arr1)); printf("%d/n", strlen(arr2)); return 0;}
?? 運行結(jié)果如下:? 3?? 隨機值
?
?
? ASCII (American Standard Code for Information Interchange)
“是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是最通用的信息交換標準,并等同于國際標準ISO/IEC 646。ASCII第一次以規(guī)范標準的類型發(fā)表是在1967年,最后一次更新則是在1986年,到目前為止共定義了128個字符”
?
? 轉(zhuǎn)意字符顧名思義就是轉(zhuǎn)變字符的意思。
?
? 讓斜杠就是斜杠:
int main(){ printf("c://test//32//test.c"); //再加一個斜杠,規(guī)避轉(zhuǎn)義字符檢測 return 0;}
?? 運行結(jié)果:? c:/test/32/test.c
? 三字母詞、輸出單引號、ffffd、xdd:
int main(){ printf("(are you ok?/?)/n"); // ??) -- ] - 三字母詞 printf("%c/n", "/""); //輸出一個單引號 printf("%s/n", "/""); //輸出一個雙引號 printf("%c/n", "/130");//8進制的130是10進制的多少呢? //X - ASCII碼值是88 printf("%c/n", "/101"); // A- 65 - 8進制是:101 printf("%c/n", "/x30"); //48 - "0" return 0;}
? 運行結(jié)果:? (are you ok??) " " X A 0
? 下列代碼打印的結(jié)果是什么?
int main(){ printf("%d/n", strlen("c:/test/328/test.c")); return 0;}
? 答案:14
?
? 代碼中有不需要的代碼可以直接刪除,也可以注釋掉
代碼中有些代碼比較難懂,可以加一下注釋文字
有兩種風格:
① C語言風格的注釋 ? /*?xxxxxx?*/
缺陷:不能嵌套注釋
② C++風格的注釋 ?? //xxxxxxxxx
優(yōu)點:可以注釋一行也可以注釋多行
快捷鍵:Ctrl + /?
? 演示:
/* C語言風格注釋int Add(int x, int y) { int z = 0; z = x + y; return z;}*/int Add(int x, int y) { return x + y;}int main(void){ // C++注釋風格 // int a = 10; printf("%d/n", Add(1,2)); //調(diào)用Add函數(shù) return 0;}
? 定義:if 語句是指編程語言(包括c語言、C#、VB、java、匯編語言等)中用來判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。
?
? 選擇語句代碼演示:
int main(void){ int a = 10; int b = 20; if(a>b) { printf("a比b大/n") ; } else { printf("b比a大/n"); } return 0;}
? 運行結(jié)果:? b比a大
?? C語言中如何實現(xiàn)循環(huán)呢?
1. while 語句
2. for 語句
3. do ... while 語句
這里我們著重先了解下 while 語句。
? while 循環(huán)的基本概念:while是計算機的一種基本循環(huán)模式。當滿足條件時進入循環(huán),進入循環(huán)后,當條件不滿足時,跳出循環(huán)。
?
? 演示代碼:敲三萬行代碼
#include int main(void){ int line = 0; while(line < 30000) { printf("敲代碼: %d/n", line); line++; } if(line == 30000) { printf("恭喜你敲滿30000行代碼!/n"); } return 0;}
? 什么是函數(shù)?
數(shù)學(xué)中的函數(shù) f(x) = 2×x+5,C語言中的函數(shù)也是一樣的。
? 函數(shù)的特點就是:簡化代碼,代碼復(fù)用。
?
? 代碼演示:
int Add (int x, int y) { int z = 0; z = x + y; return z;}int main(void){ int num1 = 0; int num2 = 0; scanf("%d%d", &num1, &num2); // int sum = num1 + num2; // 函數(shù)的方式解決 int sum = Add(num1, num2); printf("%d/n", sum); return 0;}
?
? 要存儲1-10的數(shù)字,怎么存儲?
“C語言給了數(shù)組的定義:一組相同類型元素的集合”
定義一個整型數(shù)組,最多放十個元素:
?
? 代碼演示:
int main(){ int a = 0; int b = 0; int c = 0; int d = 0; //... // 10個整型1-10存起來 int arr[10] = {1,2,3,4,5,6,7,8,9,10}; char ch[5] = {"a", "b", "c"}; // 不完全初始化,剩余的默認為0 // 用下標就可以訪問元素 printf("%d/n", arr[0]); // 打印整個數(shù)組 int i = 0; while(i<10) { printf("%d ", arr[i]); i++; } return 0;}
?
? 什么是算數(shù)操作符?
? 算術(shù)運算符即算術(shù)運算符號。是完成基本的算術(shù)運算 (arithmetic operators) 符號,就是用來處理四則運算的符號。
?
? 代碼演示:
int main(){ int add = 1 + 1; int sub = 2 - 1; int mul = 2 * 3; float div = 9 / 2.0; //只要有浮點數(shù)出現(xiàn),執(zhí)行的就是浮點數(shù)除法 int mod = 123 % 10; return 0;}
? 什么是移位操作符?
? 移位運算符在程序設(shè)計中,是位操作運算符的一種。移位運算符可以在二進制的基礎(chǔ)上對數(shù)字進行平移。
?
? 代碼演示:
int main(){ // 移位操作符 移動的是它的二進制位 // << 左移 // >> 右動 int a = 1; // 整形1占4個字節(jié)-32bit位 // 0000000000000000000000000000001 int b = a<<1; // 0000000000000000000000000000010 左邊丟棄,右邊補0 printf("%d/n", b); printf("%d/n", a); return 0;}
?? 運行結(jié)果: 2 1
? 什么是位操作符?
? 位操作是程序設(shè)計中對位模式按位或二進制數(shù)的一元和二元操作
? 代碼演示:
#include int main(){ //位操作 依然是二進制位 // & 按位與 都為真,則返回真,只要出現(xiàn)假,就返回假 int a = 3; //真 int b = 5; //真 int c = a&b; //按位與 // 011 // 101 // 001 // R→ 1 //真 printf("%d/n", c); int d = a|b;// 按位或 有真則為真,無則假,只要出現(xiàn)真,就返回真 // 011 // 101 // 111 // R→ 7 printf("%d/n", d); int e = a^b;// 按位異或 相同為假,相異為真 11/ 00-> 0 10 -> 1 //異或的計算規(guī)律 //對應(yīng)的二進制位相同,則為0 //對應(yīng)的二進制位相異,則為1 // 011 // 101 // 110 // R→ printf("%d/n", e); return 0;}
? 什么是賦值操作符?
? 賦值運算符是雙目運算符,用在賦值表達式中。賦值運算符將值存儲在運算符左邊操作數(shù)指定的變量中。
?
? 代碼演示:
#include int main(){ int a = 10; a = 20; // “=” 賦值 “==” 判斷相等 a = a+10; //1 a += 10; // 2 a = a-20; a -= 20; a = a & 2; a &= 2; //這些操作叫做 復(fù)合賦值符 return 0;}
? 什么是單目操作符?
? 單目操作符,也就是只接受一個操作數(shù)的操作符。
?
? 邏輯反操作 !
int main(){ //0表示假,非0就是真 int a = 5; printf("%d/n", !a); if(a) { //如果a為真,做事 } if(!a) { //如果a為假,做事 } while(a); //a != 0,做事 while(!a); //a=0,做事 return 0;}
?
? 按位取反 ~
int main(){ int a = 0; printf("%d/n", ~a); // ~ 按(二進制)位取法 //把所有二進制位的數(shù)字,1變成0,0變成1 //整數(shù)a // 0 // 00000000000000000000000000000000 // 11111111111111111111111111111111 ~a // 數(shù)據(jù)在內(nèi)存中存儲的是補碼 // 一個整數(shù)的二進制表示有三種: 原碼 反碼 補碼 // 負數(shù)的計算 -1: // 10000000000000000000000000000001 (原碼) // 11111111111111111111111111111110 (反碼) // 11111111111111111111111111111111 (補碼) -> 在內(nèi)存中存的 // 正的整數(shù): 原碼、反碼、補碼相同 return 0;}
? 前置++
int main(){ int a = 10; int b = ++a; //前置++, 先++后使用 printf("%d/n", b); //11 printf("%d/n", a); //11 return 0;}
? 后置++
int main(){ int a = 10; int b = a++; //后置++,先使用再++ printf("%d/n", b); printf("%d/n", a); return 0;}
? 強制類型轉(zhuǎn)換:
int main(){ int a = (int)3.14; //強制類型轉(zhuǎn)換 printf("%d/n", a); return 0;}
? 邏輯運算符或邏輯聯(lián)結(jié)詞把語句連接成更復(fù)雜的復(fù)雜語句
邏輯與:兩個都為真即為真(and)
邏輯或:一個為真即為真(or)
?
? 邏輯與 &&
int main(){ int a = 3; int b = 5; int c = a && b; printf("%d/n", c); //1 return 0;}
?
? 邏輯或 ||
int main(){ int a = 3; int b = 0; int c = a||b; printf("%d/n", c); //1 return 0;}
? 條件操作符就是三目操作符
exp1成立,exp2計算,整個表達式的結(jié)果是:exp2的結(jié)果。
exp1不成立,exp2計算,整個表達式的結(jié)果是:exp3的結(jié)果。
?
? 條件操作符的用法:
int main(){ //exp1成立,exp2計算,整個表達式的結(jié)果是:exp2的結(jié)果 //exp1不成立,exp3計算,整個表達式的結(jié)果是exp3的結(jié)果 int a = 0; int b = 3; int max = 0; /* 等價于 if(a>b) { max = a; } else { max = b; } */ max = a>b ? a : b; return 0;}
? 逗號表達式:逗號隔開的一串表達式。
逗號表達式是從左向右依次計算的。
整個表達式的結(jié)果是最后一個表達式的結(jié)果。
?
? 逗號表達式的用法演示:
int main(){ (2, 3+5, 6); int a = 0; int b = 3; int c = 5; // a=5 c=5-4 b=1+2 int d = (a=b+2, c=a-4, b=c+2); printf("%d/n", d); // 3 return 0;}
?? [] 就是下標引用操作符。
? 演示:
int main(){ int arr[10] = {1,2,3,4,5,6,7,8,9,10}; printf("%d/n", arr[5]); // 6 return 0;}
? 調(diào)用函數(shù)時,函數(shù)名后面的()就是函數(shù)調(diào)用操作符
? 演示:
int main(){ printf("hehe/n"); printf("%d", 100); return 0;}
? C語言提供的關(guān)鍵字:
1. C語言提供的,不能自己創(chuàng)建關(guān)鍵字
2. 關(guān)鍵字不能做變量名
?這里我們來簡單地介紹幾個:
? auto - 自動的
int main(){ { int a = 10; //自動創(chuàng)建,自動銷毀的 - 自動變量 // auto省略掉了 auto int a = 10; // auto新的C語言中也有其它用法 - 暫時不考慮 } return 0;}
? register - 寄存關(guān)鍵字
int main(){ // 大量/頻繁使用的數(shù)據(jù),想放在寄存器中,提升效率 register int num = 100; //建議num的值存放在寄存器中 //是不是最終放到寄存器中是編譯器說的算 // 其實現(xiàn)在編輯器已經(jīng)很聰明了, // 就算你不主動加register,它也會幫你存到寄存器中。 return 0;}
? typedef - 類型重命名
// 這種羅里吧嗦的變量我們可以把它重命名一下typedef unsigned int u_int;int main(){ unsigned int num = 100; u_int num2 = 100; //和上面是等價的 return 0;}
? static - 靜態(tài)的
1. static修飾局部變量
2. static修飾全局變量
3. static修飾函數(shù)
? static修飾局部變量
函數(shù)中局部變量:
聲明周期延長:該變量不隨函數(shù)結(jié)束而結(jié)束
初始化:只在第一次調(diào)用該函數(shù)時進行初始化
記憶性:后序調(diào)用時,該變量使用前一次函數(shù)調(diào)用完成之后保存的值
存儲位置:不會存儲在棧上,放在數(shù)據(jù)段
void test() { static int a = 1; //不銷毀,生命周期變長了 a++; printf("%d ", a);}int main(){ int i = 0; while(i<10) { test(); i++; } return 0;}
? 運行結(jié)果: 2 3 4 5 6 7 8 9 10 11
?
?
? static修飾全局變量
改變該變量的鏈接屬性,讓該變量具有文件作用域,即只能在當前文件中使用。
① Global.c:
static int g_val = 2021;// static 修飾全局變量,// 使得這個全局變量只能在自己所在的源文件(.c)內(nèi)部可以使用// 其他的源文件不能使用!// 全局變量,在其他原文件內(nèi)部可以被使用,是因為全局變量具有外部鏈接屬性// 但是被static修飾之后,就變成了內(nèi)部鏈接屬性,// 其他的源文件就不能鏈接到這個靜態(tài)的全局變量了!
② test.c:
extern int g_val;int main(){ printf("%d/n", g_val); return 0;}
? 運行結(jié)果: test.obj : error LNK2001: 無法解析的外部符號 _g_val
?
? static修飾函數(shù)
改變該函數(shù)的鏈接屬性,讓該函數(shù)具有文件作用域,即只能在當前文件中使用。
① Add.c:
//static修飾函數(shù),static int Add(int x, int y) { return x + y;}
? test1.c:
extern int Add(int, int); //聲明外部函數(shù)int main(){ int a = 10; int b = 20; int sum = Add(a, b); printf("sum = %d/n", sum); return 0;}
? 運行結(jié)果:
test.obj : error LNK2019: 無法解析的外部符號 _Add,該符號在函數(shù) _main 中被引用
?
? define 是一個預(yù)處理指令:
1. define 定義標識符常量
2. define 定義宏
? define 定義標識符常量:
#define MAX 1000int main(){ printf("%d/n", MAX); return 0;}
? define 定義宏:
#define ADD(X, Y) X+Y#define ADD1(X, Y) ((X)+(Y))int main(){ printf("%d/n", 4*ADD(2, 3)); // 4*2+3 = 11 printf("%d/n", 4*ADD1(2, 3)); // 4*(2+3) = 20 return 0;}
? 什么是指針?
指針就是地址,地址就是指針。
指針,是C語言中的一個重要概念及其特點,也是掌握C語言比較困難的部分。指針也就是內(nèi)存地址,指針變量是用來存放內(nèi)存地址的變量,不同類型的指針變量所占用的存儲單元長度是相同的,而存放數(shù)據(jù)的變量因數(shù)據(jù)的類型不同,所占用的存儲空間長度也不同。有了指針以后,不僅可以對數(shù)據(jù)本身,也可以對存儲數(shù)據(jù)的變量地址進行操作。
?
? 變量都有地址,取出變量的地址如下:
int main(){ int a = 10; // a在內(nèi)存中要分配空間 - 4個字節(jié) &a; // 取出num的地址 printf("%p/n", &a); //%p - 以地址的形式打印 return 0;}
? 打印出來的是a的地址
?
? 定義指針變量,存儲地址
* 說明 pa 是指針變量
int 說明 pa 執(zhí)行的對象是 int 類型的
int main(){ int a = 10; int* pa = &a; // pa是用來存放地址的,在C語言中叫pa的是指針變量 char ch = "w"; char* pc = &ch; return 0;}
如果把定義指針理解為包裝成快遞,那么“解引用操作”就可以理解為是拆包裹
拆出來的值就是那個變量的值,甚至還可以通過“解引用”來修改它的值。
? 解引用操作用法:
int main(){ int a = 10; int* pa = &a; *pa = 20; // * 解引用操作 *pa就是通過pa里邊的地址,找到a printf("%d/n", a); //20 return 0;}
? 指針的大小
“指針的大小是相同的”
? 為什么相同?
“因為指針是用來存放地址的,指針需要多大空間,取決于地址的存儲需要多大空間”
? 指針是一種復(fù)合數(shù)據(jù)類型,指針變量內(nèi)容是一個地址,因此一個指針可以表示該系統(tǒng)的整個地址集合,故按照32位編譯代碼,指針占4個字節(jié),按照64位編譯代碼,指針占8個字節(jié)(注意:不是64位系統(tǒng)一定占8個字節(jié),關(guān)鍵是要按照64位方式編譯)。
32位 - 32bit - 4byte
64位 - 64bit - 8byte
? sizeof 計算指針的大小:
int main(){ printf("%d/n", sizeof(char*)); printf("%d/n", sizeof(short*)); printf("%d/n", sizeof(int*)); printf("%d/n", sizeof(long*)); printf("%d/n", sizeof(long long*)); printf("%d/n", sizeof(float*)); printf("%d/n", sizeof(double*)); return 0;}
32位下都是 4???????? 64位下都是 8
? 結(jié)構(gòu)體可以讓C語言創(chuàng)建出新的類型
“結(jié)構(gòu)體是C語言中特別重要的知識點,結(jié)構(gòu)體使得C語言有能力描述復(fù)雜的類型”
? 使用結(jié)構(gòu)體描述學(xué)生 / 描述書:
// 創(chuàng)建一個學(xué)生的類型struct Stu { char name[20]; // 姓名 int age; // 年齡 double score; // 分數(shù)}; // ← 不要忘了加分號// 創(chuàng)建一個書的類型struct Book { char name[20]; float price; char id[30];};
? 結(jié)構(gòu)體的初始化:
點操作符和箭頭操作符
. 結(jié)構(gòu)體變量.成員
-> 結(jié)構(gòu)體指針->成員
struct Stu { char name[20]; // 姓名 int age; // 年齡 double score; // 分數(shù)};struct Book { char name[20]; float price; char id[30];};int main(){ struct Stu s = {"張三", 20, 85.5}; // 結(jié)構(gòu)體的創(chuàng)建和初始化 // 點操作符 printf("1: %s %d %lf/n", s.name, s.age, s.score); struct Stu* ps = &s; printf("2: %s %d %lf/n", (*ps).name, (*ps).age, (*ps).score); // ? // 箭頭操作符 printf("3: %s %d %lf/n", ps->name, ps->age, ps->score); // ? return 0;}
Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .
俞甲子 / 石凡 / 潘愛民. 《程序員的自我修養(yǎng)》[M]. 電子工業(yè)出版社, 2009-4.
百度百科[EB/OL]. []. https://baike.baidu.com/.
比特科技. C語言基礎(chǔ)[EB/OL]. 2021[2021.8.31]. .
本章完。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/121144.html
摘要:嚴格地說,應(yīng)該是模仿實驗。為什么覺得無從下手,看資料沒有頭緒經(jīng)驗總結(jié)看資料需要計劃耐心和速度這里所謂的資料包括書籍文檔。建議有報銷條件的同學(xué)自己設(shè)計一塊板子學(xué)習。無法報銷的同學(xué),可以選購一款開發(fā)板學(xué)習。 STM32系列基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計的ARMCortex...
摘要:本文的作者是之前編程教室的實訓(xùn)生之一,原本在汽車制造車間里工作,后來成功轉(zhuǎn)行為一名程序員,從事車載語音識別相關(guān)軟件的開發(fā)。通過編程教室的公眾號看到先生招實訓(xùn)生的公告,毛遂自薦之后拿到,然后從就職的車企辭職,來到上海。 這篇文章在我的草稿箱里躺了有一年多,今天總算是發(fā)出來了。本文的作者是之前編程教室的實訓(xùn)生之一,原本在汽車制造車間里工作,后來成功轉(zhuǎn)行為一名程序員,從事車載語音識別相關(guān)軟件...
摘要:前言回顧前面多線程三分鐘就可以入個門了源碼剖析多線程基礎(chǔ)必要知識點看了學(xué)習多線程事半功倍鎖機制了解一下簡簡單單過一遍只有光頭才能變強上一篇已經(jīng)將鎖的基礎(chǔ)簡單地過了一遍了,因此本篇主要是講解鎖主要的兩個子類那么接下來我們就開始吧一鎖首先我們來 前言 回顧前面: 多線程三分鐘就可以入個門了! Thread源碼剖析 多線程基礎(chǔ)必要知識點!看了學(xué)習多線程事半功倍 Java鎖機制了解一下 AQ...
摘要:列入全國計算機二級取代,部分城市試點,引入高中。建議通過視頻學(xué)習,這樣不但節(jié)省時間,而且效果很好。能否回憶起那個陡峭的學(xué)習曲線問題越多,學(xué)的越快。出報告每完成一個項目,總結(jié)報告,必不可少。結(jié)構(gòu)化學(xué)習,才是你我需要真正培養(yǎng)的能力。 編程就如同你學(xué)習開車,即使,你可以一口氣,說出一輛車的全部零部件,以及內(nèi)燃機進氣、壓縮、做功和排氣過程,但你就是不去練如何開車,怎么上路。你確定,你敢開嗎?你...
摘要:從白天到晚上,不是在學(xué)就是在學(xué)的路上,從測試理論到實戰(zhàn)操作,大大小小的問題,在群里前輩的幫助下,總是能很快解決。慢慢的,測試方法,用例設(shè)計,測試,測試,接口測試。大概面試了一周多,我就拿下了的。 ...
閱讀 1640·2021-10-09 09:44
閱讀 2797·2021-10-08 10:04
閱讀 2470·2021-09-26 09:55
閱讀 3848·2021-09-22 10:02
閱讀 3314·2019-08-29 17:08
閱讀 1071·2019-08-29 15:08
閱讀 2959·2019-08-26 13:52
閱讀 3275·2019-08-26 13:34