第8章 指針(正在更新中......)
運(yùn)行環(huán)境以Dev-C++、Visual Studio 2022、MacOS的命令行和Xcode為主
1.指針的概念
-
1.1 內(nèi)存
-
內(nèi)存是
CPU和硬盤(pán)之間交換數(shù)據(jù)的緩沖區(qū),屬于存儲(chǔ)設(shè)備,斷電后數(shù)據(jù)會(huì)丟失。 動(dòng)態(tài)運(yùn)行著的程序會(huì)加載到內(nèi)存中,如正在玩的游戲、正在聽(tīng)的歌、正在編輯的課件、正在瀏覽的網(wǎng)頁(yè)等 -
計(jì)算機(jī)
CPU處理數(shù)據(jù)時(shí),通常從內(nèi)存中讀取數(shù)據(jù),處理后的數(shù)據(jù)也會(huì)寫(xiě)到內(nèi)存中。內(nèi)存被劃分為多個(gè)內(nèi)存單元,每個(gè)內(nèi)存單元的大小為1個(gè)字節(jié)Byte,即8個(gè)比特bit -
買(mǎi)手機(jī)時(shí)的
16GB + 256GB,16 表示運(yùn)行內(nèi)存(運(yùn)存)為16GB
![image]()
-
-
1.2 地址
-
計(jì)算機(jī)的每個(gè)內(nèi)存單元都會(huì)有個(gè)編號(hào)(相當(dāng)于門(mén)牌號(hào)),
CPU通過(guò)該編號(hào)可以快速定位到內(nèi)存空間 -
在計(jì)算機(jī)中將內(nèi)存單元的編號(hào)稱(chēng)為地址,C語(yǔ)言又賦予這個(gè)地址一個(gè)新名稱(chēng)——指針
![image]()
-
計(jì)算機(jī)中的編址,并不是把每個(gè)字節(jié)的地址記錄下來(lái),而是通過(guò)硬件設(shè)計(jì)完成。硬件之間通過(guò)“線(xiàn)”傳遞的信息協(xié)同工作,比如
CPU和內(nèi)存之間有大量數(shù)據(jù)交互,兩者通過(guò)“線(xiàn)”連接起來(lái)。這些“線(xiàn)”共有三類(lèi)-
地址總線(xiàn)
-
定位數(shù)據(jù)的“導(dǎo)航系統(tǒng)”
-
傳遞
CPU要訪問(wèn)的內(nèi)存單元或外設(shè)端口的地址信息,用于確定數(shù)據(jù)的來(lái)源或目的地。CPU讀寫(xiě)數(shù)據(jù)前,先通過(guò)地址總線(xiàn)指定要操作的內(nèi)存地址,內(nèi)存根據(jù)地址定位對(duì)應(yīng)的存儲(chǔ)單元,存儲(chǔ)單元中的數(shù)據(jù)通過(guò)數(shù)據(jù)總線(xiàn)傳入CPU寄存器 -
32位機(jī)器有32根地址總線(xiàn),尋址范圍為
4GB;64位機(jī)器有64根地址總線(xiàn),尋址范圍為18EB
-
-
數(shù)據(jù)總線(xiàn)
-
傳輸主句的“主干道”
-
在
CPU與內(nèi)存、外設(shè)之間雙向傳輸實(shí)際的數(shù)據(jù)。如指令、運(yùn)算結(jié)果、輸入輸出數(shù)據(jù)等 -
數(shù)據(jù)既可從
CPU發(fā)送到外部(如寫(xiě)入內(nèi)存),也可從外部傳輸?shù)?code>CPU(如讀取內(nèi)存數(shù)據(jù))
-
-
控制總線(xiàn)
-
協(xié)調(diào)操作的“指揮系統(tǒng)”
-
傳輸各種控制信號(hào)和狀態(tài)信號(hào),協(xié)調(diào) CPU 與內(nèi)存、外設(shè)之間的操作時(shí)序和同步
-
![image]()
-
-
-
1.3 指針
-
含義與特征
-
指針也就是內(nèi)存地址,指針變量是用來(lái)存放這些內(nèi)存地址的變量
-
不同類(lèi)型的指針占用的存儲(chǔ)空間長(zhǎng)度相同,因?yàn)樗鼈兌际堑刂罚?strong>地址的長(zhǎng)度與操作系統(tǒng)有關(guān),與數(shù)據(jù)類(lèi)型無(wú)關(guān)
-
-
定義變量的實(shí)質(zhì)
-
C語(yǔ)言通過(guò)變量來(lái)使用存儲(chǔ)空間,內(nèi)存中每個(gè)存儲(chǔ)空間都有編號(hào),稱(chēng)為地址
-
定義變量時(shí),編譯器根據(jù)變量的數(shù)據(jù)類(lèi)型分配相應(yīng)長(zhǎng)度的存儲(chǔ)空間,該存儲(chǔ)空間內(nèi)存儲(chǔ)的是變量的值,而存儲(chǔ)空間的地址就是變量的地址,即指針
-
用戶(hù)僅通過(guò)變量名就可訪問(wèn)存儲(chǔ)空間的方式稱(chēng)為“直接訪問(wèn)方式”。類(lèi)似地,通過(guò)變量的地址解引用獲取變量的值,這種訪問(wèn)方式稱(chēng)為“間接訪問(wèn)方式”
![image]()
-
-
2.指向簡(jiǎn)單變量的指針
- 一般格式:
類(lèi)型標(biāo)識(shí)符 *指針變量名或類(lèi)型標(biāo)識(shí)符* 指針變量名或類(lèi)型標(biāo)識(shí)符*指針變量名
int *p = NULL; // 未初始化的指針指向的對(duì)象不確定,建議定義指針變量的同時(shí)初始化為NULL,即空
char *str = NULL;
-
注意事項(xiàng)
-
1.類(lèi)似定義普通變量時(shí)初始化為0,定義指針變量時(shí)建議直接初始化為
NULL -
2.定義指針變量時(shí)用的
*是指針變量的標(biāo)志,靠近 類(lèi)型標(biāo)識(shí)符 或 指針變量名 均可 -
3.訪問(wèn)指針變量指向空間中的數(shù)據(jù)時(shí)用的
*是指針運(yùn)算符,也稱(chēng)解引用操作符優(yōu)先級(jí)為2 -
4.
&也是指針運(yùn)算符,即取地址運(yùn)算符,優(yōu)先級(jí)為2 -
5.
int型指針變量指向的對(duì)象是int類(lèi)型,以此類(lèi)推 -
6.定義多個(gè)指針變量時(shí),每個(gè)變量旁邊都要加上
*
int *p1 = NULL, *p2 = NULL; // 定義了兩個(gè)整型指針變量 p1 和 p2 char *s1 = NULL, s2 = 0, s3 = 0; // 只有s1是字符型指針變量,s2 和 s3均為普通字符型變量- 7.同類(lèi)型的指針變量可以相互賦值
![image]()
-
-
案例分析
- 1.通過(guò)指針變量訪問(wèn)變量
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int a = 123, b = 45, *p1 = NULL, *p2 = NULL; float x = 1.25, y = -0.98, *q1 = NULL, *q2 = NULL; p1 = &a; p2 = &b; q1 = &x; q2 = q1; printf("a=%d, b=%d\n", a, b); printf("*p1=%d, *p2=%d\n", *p1, *p2); printf("\nx=%f, y=%f\n", x, y); printf("*q1=%f, *q2=%f\n", *q1, *q2); return 0; }![image]()
![image]()
3.指向數(shù)組的指針變量
-
3.1 指向一維數(shù)組的指針變量
-
一維數(shù)組與指針的關(guān)系
-
一維數(shù)組的數(shù)組名表示數(shù)組的首地址,即第1個(gè)數(shù)組元素的地址
-
將數(shù)組的起始地址或某元素的地址存放到一個(gè)指針變量中,該變量就可以指向整個(gè)數(shù)組或單個(gè)數(shù)組元素
int a[5] = {0}; int *p = NULL; p = a; // 指針變量p指向數(shù)組a的第1個(gè)元素a[0] p = &a[0]; // 指針變量p指向數(shù)組a的第1個(gè)元素a[0]- 無(wú)論一維數(shù)組元素占據(jù)多少空間,當(dāng)
指針p指向其中一個(gè)元素時(shí),p + 1均指向它的下一個(gè)元素 a[i]、*(a + i)、*(p + i)等價(jià)
![image]()
-
-
案例分析
- 1.通過(guò)數(shù)組下標(biāo)和指針變量輸出數(shù)組元素
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int a[5] = {5, 4, 3, 2, 1}; int i = 0, *p = a; for (i = 0; i < 5; i++) { printf("%d, %d, %d\n", a[i], *(a+i), *(p+i)); } return 0; } // 指針變量也是變量,值可以修改;數(shù)組名是一個(gè)地址常量,不能重新賦值![image]()
- 2.
for循環(huán)中使用指針移動(dòng)的方式輸出數(shù)組元素
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int a[5] = {0}; int i = 0, *p = NULL; printf("輸入5個(gè)整數(shù): "); for (i = 0; i < 5; i++) { scanf("%d", a + i); } for (p = a; p < a + 5; p++) { printf("%-4d", *p); } return 0; }![image]()
- 3.輸出數(shù)組元素,驗(yàn)證
a[i] 和 *(p + i)不總是相等
#include <stdio.h> int a[5] = {1, 2, 3, 4, 5}; int main(int argc, const char * argv[]) { // insert code here... int *p = NULL, i = 0; i = 2; p = a + 1; printf("%d %d\n", a[i], *(p+i)); // 3 4 return 0; } // p 最開(kāi)始已經(jīng)指向了 a[1],加上 i 后指向了 a[3] // 由于解引用運(yùn)算符 * 的優(yōu)先級(jí)高于 +,p + i 整體要放入括號(hào)中
-
-
3.2 指向多維數(shù)組的指針變量
-
二維數(shù)組與指針的關(guān)系
-
二維數(shù)組是一種特殊的一維數(shù)組,即元素是一維數(shù)組的數(shù)組。如
int a[4][3];是由4個(gè)元素a[0]、a[1]、a[2]、a[3]組成的一維數(shù)組,它們均有3個(gè)元素 -
可以將
a[0]、a[1]、a[2]、a[3]看做這些一維數(shù)組的數(shù)組名或地址,也可以用指針指向這些地址
int a[4][3] = {0}; a[0] {a[0][0], a[0][1], a[0][2]} a[1] {a[1][0], a[1][1], a[1][2]} a[2] {a[2][0], a[2][1], a[2][2]} a[3] {a[3][0], a[3][1], a[3][2]} // a 即 a + 0 是數(shù)組的首地址,即元素 a[0][0] 的地址 // a + 1 是數(shù)組第 2 行的首地址,即元素 a[1][0] 的地址 // a + 2 是數(shù)組第 3 行的首地址,即元素 a[2][0] 的地址 // a + 3 是數(shù)組第 4 行的首地址,即元素 a[3][0] 的地址-
在二維數(shù)組中,
a是數(shù)組名,數(shù)組名表示數(shù)組首元素的地址,這里的首元素應(yīng)理解為二維數(shù)組的第一行元素,而不是第一個(gè)元素,即使兩者的地址值相同 -
在二維數(shù)組中,
a + i與a[i]均可表示數(shù)組中第i + 1行的首地址,但兩者不完全等同-
a + i的類(lèi)型是int (*)[3],是指向包含 3 個(gè)整型元素的數(shù)組的指針(數(shù)組指針),它指向數(shù)組a的第i + 1行。又因?yàn)檫@一行第一個(gè)元素恰好是a[i][0],所以a + i與&a[i][0]在數(shù)值上相等 -
a[i]的類(lèi)型是int [3],是包含 3 個(gè)整型元素的數(shù)組,可以看做二維數(shù)組a的內(nèi)層數(shù)組名。恰好因?yàn)樗菙?shù)組名,而數(shù)組名又是數(shù)組首元素的地址,所以它被隱式轉(zhuǎn)換為指向其首元素的指針,類(lèi)型為int *,指向a[i][0],即&a[i][0] -
解引用操作符
*用于取出指針指向空間的內(nèi)容,因此*(a + i)就是取出數(shù)組a的第i + 1行,這一行恰好是是a[i],所以*(a + i)與a[i]等價(jià)
-
![image]()
-
-
案例分析
- 1.輸出數(shù)組
int a[4][3]中第 3 行的所有元素
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... static int a[4][3] = { {1, 2, 3}, {4, 5 ,6}, {7, 8, 9}, {10, 11, 12}}; int *p = NULL; // a[2] 是二維數(shù)組中下標(biāo)為2的行,即一維數(shù)組 {7, 8, 9}。將 a[2] 看做一維數(shù)組的數(shù)組名,它表示數(shù)組中第一個(gè)元素的地址,即 7 的地址 // a[2] + 3 以單個(gè)整型數(shù)據(jù)為增量,而不是以數(shù)組 a 的行長(zhǎng)度為增量 for (p = a[2]; p < a[2] + 3; p++) { printf("%d ", *p); // 7 8 9 } printf("\n"); return 0; } #include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... static int a[4][3] = { {1, 2, 3}, {4, 5 ,6}, {7, 8, 9}, {10, 11, 12}}; int *p = NULL; // a[2] 是二維數(shù)組中下標(biāo)為2的行的數(shù)組名,數(shù)組名也是數(shù)組首地址,即 &a[2][0] for (p = &a[2][0]; p < a[2] + 3; p++) { printf("%d ", *p); } printf("\n"); return 0; }- 2.指針與數(shù)組首地址的關(guān)系
#include <stdio.h> #define fa "%x, %x, %x\n" int a[4][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int main(int argc, const char * argv[]) { // a 是二維數(shù)組首元素的地址,即第一行的地址,本質(zhì)上是數(shù)組指針,類(lèi)型為int (*)[3](指向包含3個(gè) int 的數(shù)組的指針) // p 是普通的整型指針,類(lèi)型為 int *(指向一個(gè) int 數(shù)據(jù)),兩者類(lèi)型不同導(dǎo)致IDE觸發(fā)警告?? // 強(qiáng)行賦值之后 p 指向了數(shù)組 a 中的第 1 個(gè)元素,p + 1 的增量是單個(gè)整型元素的長(zhǎng)度,而非數(shù)組 a 中一維數(shù)組的長(zhǎng)度,這是由 p 的類(lèi)型確定的 int *p = a; // a 是二維數(shù)組第 1 行的地址,與 a + 0 相同。a[0] 恰好也是二維數(shù)組第一行的數(shù)組名,所以三者的值相等 printf(fa, a, a+0, a[0]); // a + 1 是二維數(shù)組第二行的地址,也是一個(gè)數(shù)組指針,類(lèi)型為int (*)[3] // a[1] 是二維數(shù)組的第 2 個(gè)元素,是包含 3 個(gè) int 的一維數(shù)組,類(lèi)型是 int [3]。作為一維數(shù)組的數(shù)組名會(huì)被隱式轉(zhuǎn)換為“指向其首元素的指針” // *a[1] 中 [] 的優(yōu)先級(jí)高于 *,即 *(a[1])。a[1] 指向了首元素,等價(jià)于 &a[1][0],再解引用即 a[1][0] printf(fa, a+1, a[1], *a[1]); // p 的值與 a 的值一致,也與 &a[0][0]的值一致,解引用后為 a[0][0] // 類(lèi)似的,*(p+1) 為 a[0][1] printf(fa, p, *p, *(p+1)); return 0; }![image]()
- 3.輸出二維數(shù)組的各元素
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... static int a[][4] = { {3, 6, 5, 14}, {7, 4, 9, 12}, {45, 8, 21, 62} }; int i = 0, j = 0; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { printf("%d ", *(*(a+i) + j)); } printf("\n"); } return 0; } // a + i 是指向行標(biāo)為 i 的數(shù)組指針,*(a + i) 即對(duì)指針解引用,得到指針指向的內(nèi)容,即 a[i] 這個(gè)數(shù)組 // a[i] 是一維數(shù)組,數(shù)組名表示首元素的地址,所以 a[i] 也是指針,指向了一個(gè) int 數(shù)據(jù) a[i][0] // a[i] + j 即 *(a + i) + j,意為將指針 a[i] 往后偏移 j 個(gè)單位,實(shí)質(zhì)上是從 a[i][0] 開(kāi)始往后數(shù)了 j 個(gè) int 數(shù)據(jù),指向了 a[i][j] // *(*(a + i) + j) 即獲取指針 *(a + i) + j 指向的內(nèi)容,即元素 a[i][j]。所以這里的 *(*(a + i) + j) 與 a[i][j] 等價(jià)![image]()
- 4.用指針輸出二維數(shù)組的各元素
#include <stdio.h> #define M 3 #define N 4 #define L M*N int main(int argc, const char * argv[]) { // insert code here... int a[M][N] = {0}; int i = 0; int *p = NULL; printf("input array:\n"); // a[0] 本質(zhì)上是二維數(shù)組的第一行(一維數(shù)組)的數(shù)組名,指向了一維數(shù)組的第一個(gè)元素 a[0][0] // 恰好 p 是整形指針,此時(shí)不會(huì)像案例 2 報(bào)警?? // 由于 a[0] 是整型指針,它的移動(dòng)以單個(gè) int 數(shù)據(jù)為單位,數(shù)組共 L 個(gè) int 數(shù)據(jù),所以 p 最遠(yuǎn)移動(dòng)到 a[0] + (L - 1) 的位置 for (p = a[0]; p < a[0] + L; p++) { scanf("%d", p); } printf("output array:\n"); for (i = 0; i < M; i++) { // 打印階段,p 的初值指向了下標(biāo)為 i 行的首元素,即 a[i][0],類(lèi)型依然是整型指針,移動(dòng)以單個(gè) int 數(shù)據(jù)為單位,所以移動(dòng)上限是每行的元素個(gè)數(shù),即 a[i] + (N - 1) for (p = a[i]; p < a[i] + N; p++) { printf("%-4d ", *p); } printf("\n"); } return 0; }![image]()
-
5.現(xiàn)有 4 行 3 列的數(shù)組 a,分析
a、&a、a[0]有何區(qū)別-
C 語(yǔ)言中的數(shù)組名在大多數(shù)場(chǎng)景下會(huì)被隱式轉(zhuǎn)換為 "指向數(shù)組首元素的指針",但
sizeof(數(shù)組名)、&數(shù)組名例外,這兩種情況下的數(shù)組名表示整個(gè)數(shù)組 -
對(duì)于二維數(shù)組
a[4][3],數(shù)組名a表示數(shù)組首元素的地址,即第1行(一維數(shù)組)的地址。本質(zhì)上是數(shù)組指針,類(lèi)型為int (*)[3] -
&a為指向整個(gè)數(shù)組的地址,&a + 1移動(dòng)的字節(jié)數(shù)為4 * 3 * sizeof(int) -
a[0]表示二維數(shù)組的第一行(一維數(shù)組),作為數(shù)組名,它指向了一維數(shù)組的第一個(gè)元素,即&a[0][0]。a[0] + 1移動(dòng)的字節(jié)數(shù)為sizeof(int)
-
- 1.輸出數(shù)組
-
4.指向字符串的指針變量
-
4.1 字符數(shù)組和字符指針
-
C語(yǔ)言中,字符串的存儲(chǔ)可以使用字符數(shù)組或字符指針實(shí)現(xiàn),后者更方便簡(jiǎn)潔
-
字符數(shù)組名表述數(shù)組的首地址,是常量,無(wú)法修改其值
-
字符指針是變量,可被初始化指向一個(gè)字符串常量,該值為字符串常量的地址
char string[] = "this is a string!"; char *pstr = "that is a book!"; // pstr 可改為指向另一個(gè)字符串?dāng)?shù)據(jù)- 字符指針與字符數(shù)組都可以表示字符串,可以在
scanf() printf()函數(shù)中用%s格式對(duì)字符串整體輸入或輸出,但不能對(duì)數(shù)組整體賦值。以下代碼?
char s[15]; s = "fujiansheng"; // 報(bào)錯(cuò)提示:Array type 'char[15]' is not assignable // 數(shù)組名是地址常量,不能被賦值。而指針變量可以改變值,因此指針變量更靈活- 字符數(shù)組與字符指針的區(qū)別歸根結(jié)底是數(shù)組與指針變量的區(qū)別
-
-
4.2 案例分析
- 1.修改字符數(shù)組的內(nèi)容,數(shù)組的首地址是否會(huì)發(fā)生變化
#include <stdio.h> char mess[] = "I am a student"; char *p = "China"; int main(int argc, const char * argv[]) { // insert code here... int i = 0; printf("%x, %x\n", mess, p); p = "Fuzhou"; while (mess[i] != '\0') { mess[i] = mess[i + 1]; i++; } printf("%x, %x\n", mess, p); return 0; } // 雖然數(shù)組 mess 的內(nèi)容發(fā)生了變化,但 mess 的值(字符數(shù)組首地址)不變 // 指針 p 指向了另一個(gè)字符串,其值發(fā)生了變化![image]()
- 2.使用指針實(shí)現(xiàn)字符串復(fù)制函數(shù)
strcpy(s1, s2)
#include <stdio.h> char *my_strcpy(char *p, char *q) { char *start = p; if (p == NULL || q == NULL) { return NULL; } while ((*p++ = *q++) != '\0') { ; } return start; } int main(int argc, const char * argv[]) { // insert code here... char src[] = "hello world"; char dest[20] = {0}; char *ret = my_strcpy(dest, src); if (ret != NULL) { puts(dest); } else { printf("字符串復(fù)制失敗!"); } return 0; }- 3.改變數(shù)組指針的程序
#include <stdio.h> int main(int argc, const char * argv[]) { char str[30] = "money order"; char *p = str; p = p + 6; printf("%s\n", p); // 打印: order return 0; }- 4.編程輸出以下圖形
![image]()
#include <stdio.h> int main(int argc, const char * argv[]) { char *p = "12345"; while (*p != '\0') { printf("%s\n", p); p++; } return 0; } // 字符指針變量開(kāi)始指向字符串的第一個(gè)字符,以后不斷加1,使首地址不斷后移,直到'\0'結(jié)束- 5.編程輸出以下圖形
![image]()
#include <stdio.h> int main(int argc, const char * argv[]) { char *p = "*****"; char *q = p + 4; while (q >= p) { printf("%s\n", q); q--; } return 0; } // 字符指針變量 q 開(kāi)始指向字符串的最后一個(gè)字符,以后不斷減1,使首地址不斷前移,直到 q < p 結(jié)束
5.指針作為函數(shù)參數(shù)
-
5.1 應(yīng)用場(chǎng)景
- 想通過(guò)函數(shù)調(diào)用得到
n個(gè)要改變的值,可以用n個(gè)指向這些值的指針變量(地址)作為實(shí)際參數(shù)傳給調(diào)用函數(shù)的形參,借助形參指針變量間接訪問(wèn)的方式改變n個(gè)變量的值
- 想通過(guò)函數(shù)調(diào)用得到
-
5.2 案例分析
- 1.從鍵盤(pán)上輸入2個(gè)整數(shù),并將它們交換后輸出
#include <stdio.h> void swap(int *q1, int *q2) { int temp; temp = *q1; *q1 = *q2; *q2 = temp; } int main(int argc, const char * argv[]) { int a = 0, b = 0; int *p1 = &a, *p2 = &b; printf("輸入2個(gè)整數(shù):\n"); scanf("%d %d", &a, &b); swap(p1, p2); printf("交換后的2個(gè)整數(shù):\n"); printf("%d %d\n", a, b); return 0; } // 指針變量 p1 中存儲(chǔ)了變量 a 的地址,p2 中存儲(chǔ)了變量 b 的地址,通過(guò)傳參,指針變量 q1 也指向了變量 a,q2 也指向了變量 b // swap函數(shù)中操作 q1 和 q2 的解引用,本質(zhì)上就是操作的變量 a 和 b![image]()
6.指向結(jié)構(gòu)體的指針變量
-
6.1 應(yīng)用場(chǎng)景
- 結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量所占據(jù)內(nèi)存段的起始地址,也可以用來(lái)指向結(jié)構(gòu)體數(shù)組中的元素
-
6.2 案例分析
- 1.指向結(jié)構(gòu)體指針變量的定義、輸入和輸出
#include <stdio.h> // 定義結(jié)構(gòu)體類(lèi)型 struct student 和變量 s struct student { char stu_no[4]; char stu_name[10]; int score; }s = {"101", "張三", 98}; int main(int argc, const char * argv[]) { // 定義指向 struct student 結(jié)構(gòu)體類(lèi)型的指針變量 p,并將 p 賦值為結(jié)構(gòu)體變量 s 的起始地址 struct student *p = &s; // p 是結(jié)構(gòu)體指針,*p 取到了結(jié)構(gòu)體變量,(*p).stu_name 取到了結(jié)構(gòu)體變量成員 // 解引用運(yùn)算符 * 的優(yōu)先級(jí)(2)低于初等運(yùn)算符 .(1),*p 兩側(cè)的括號(hào)不可省略 // 在還有指針的結(jié)構(gòu)體成員訪問(wèn)中,推薦使用運(yùn)算符 -> printf("學(xué)號(hào): %s 姓名: %s 成績(jī): %d\n", s.stu_no, (*p).stu_name, p->score); return 0; }



















浙公網(wǎng)安備 33010602011771號(hào)