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 的核心差異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。