<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      第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 + ia[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)

      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è)變量的值
      • 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;
        }
        

      7.指針應(yīng)用實(shí)例

      posted @ 2025-08-06 22:06  pycoder_666  閱讀(8)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 免费人成再在线观看视频| 在线看片免费人成视频久网| 国产精品视频午夜福利| 毛葺葺老太做受视频| 天美传媒mv免费观看完整| 国产在线精品欧美日韩电影 | 午夜成人无码免费看网站| 亚洲成人av在线高清| 亚洲欧美日韩愉拍自拍美利坚| 99热精品毛片全部国产无缓冲| 欧美日韩国产综合草草| 精品国产熟女一区二区三区| 欧美精品一区二区三区中文字幕 | 国产精品成人亚洲一区二区| 日韩激情无码av一区二区| 国产成人综合在线女婷五月99播放 | 亚洲+成人+国产| 久久香蕉国产线看观看怡红院妓院| 欧美videos粗暴| 两个人的视频www免费| 激情伊人五月天久久综合| 四虎在线中文字幕一区| 欧美va天堂在线电影| 欧美极品色午夜在线视频 | 少妇人妻真实偷人精品| 亚洲成人av一区免费看| 日本一区二区三区专线| 哈尔滨市| 免费国产高清在线精品一区| 欧美日韩精品一区二区三区不卡 | 国产精品不卡一区二区在线| 国产精品一区二区色综合| 九九热在线免费观看视频| 亚洲成人精品综合在线| 东北妇女精品bbwbbw| 国模精品视频一区二区三区| 性欧美牲交在线视频| 66亚洲一卡2卡新区成片发布| 少妇做爰免费视看片| 黑人玩弄人妻中文在线| 日本电影一区二区三区|