首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言指標基礎:指標賦值與輸入輸出函數差異詳解

     編輯:C 語言問答

指標賦值的本質:char *q = p 到底發生了什麼?

在函數 void myfun(char *p) 內部,若寫入 char *q = p;,這並非讓 q 指向 p 這個變數的位址,而是將 p 所保存的記憶體位址複製給 q。此時 q 和 p 指向同一塊記憶體區域,透過 *q 即可存取 p 原本指向的資料。簡單說:q 是一個新的指標變數,儲存的值是 p 的值(即位址),而非 p 自身的位址。

若改寫為 char *q = *p; 會如何?

這會將 p 指向位址處的內容值(通常是一個字元)取出,並嘗試將其作為位址賦予 q。這在大多數情況下會導致非預期行為或崩潰,因為字元值極小,不太可能是合法的記憶體位址。

指向指標的指標(雙重指標)該怎麼寫?

若想讓 q 指向 p 這個指標變數本身的位址,需宣告為 char **q = &p;。此時 q 的型別是 char**,*q 等同於 p,**q 才是原本資料的值。切勿混淆 char *q = p(同層指標)與 char **q = &p(指向指標的指標)。

printf/scanf 與 gets/puts 的核心差異

  • 格式化 vs. 非格式化:printf 和 scanf 支援格式化字串(如 %d, %s),可處理多種資料型別;gets 僅讀取一整行字串(含空白),puts 僅輸出字串並自動換行,不具格式化能力。
  • 安全性:gets 不檢查緩衝區長度,極易造成緩衝區溢位,已被 C11 標準移除,請改用 fgets。
  • 換行處理:gets 會丟棄換行符,puts 會補上換行;scanf 遇空白停止,printf 需手動加 \n。

何謂「格式化」?

格式化意指透過格式控制字串(如 "%d %s"),指定輸入/輸出資料的型別、寬度、精度、進制等顯示方式,讓程式能依開發者意圖精確解析或輸出資料。

總結

  • char *q = p → q 指向 p 指向的資料(同一位址)。
  • char **q = &p → q 指向 p 這個指標變數本身。
  • 輸入輸出:優先使用 printf/scanf 或更安全的 fgets/fputs,避免使用 gets。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved