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

C語言字符串指針與字符數組區別深度解析

     編輯:關於C語言

C語言字符串指針與字符數組區別深度解析

字符指針 char *p = "hello" 與字符數組 char a[] = "hello" 外觀相似,本質天壤之別。本文從存儲、賦值、修改、傳參四個維度深度對比。

核心區別總表

特性字符指針 char *p字符數組 char a[]
本質指針變量,存地址數組對象,存內容
字符串存儲只讀數據區(字面量)棧上(可修改)
初始化後賦值p = "world" ✅a = "world" ❌ 數組名非左值
修改字符內容p[0]='H' ❌ 段錯誤a[0]='H' ✅
sizeof 結果指針大小(4/8 字節)數組總長度(含 \0)
作為參數傳遞傳指針值退化為指針傳遞

經典錯誤代碼與修正

錯誤 1:未初始化指針直接輸入

// ❌ 危險:指向隨機地址
char *name;
scanf("%s", name);  // 未定義行為

// ✅ 修正:用數組
char name[20];
scanf("%s", name);

// ✅ 修正:分配內存
char *name = malloc(20);
scanf("%s", name);
free(name);

錯誤 2:嘗試修改字面量

// ❌ 運行時崩潰
char *p = "hello";
p[0] = 'H';  // 段錯誤

// ✅ 正確:用數組
char a[] = "hello";
a[0] = 'H';  // 合法

// ✅ 正確:只讀指針
const char *p = "hello";
// p[0] = 'H';  // 編譯期報錯

內存佈局圖解

字符指針:                    字符數組:
棧區:p ──────┐               棧區:a[0]='h'
              │               a[1]='e'
只讀區:"hello"←┘               a[2]='l'
                              a[3]='l'
                              a[4]='o'
                              a[5]='\0'

函數參數傳遞建議

// 輸入參數:只讀
void print_str(const char *str);  // 接受指針或數組

// 輸出參數:需寫入
void get_str(char *buf, int size);  // 必須傳可寫緩衝區(數組或 malloc)

// 返回字符串:靜態/動態分配
const char *get_literal() { return "fixed"; }  // 字面量安全
char *get_dynamic() { return malloc(n); }      // 調用者須 free

最佳實踐清單

  1. 字面量賦值必加 const:const char *p = "..."
  2. 需修改字符串內容 → 用數組或 malloc
  3. 函數參數只讀 → const char *
  4. 避免返回棧上數組指針
  5. 動態分配記得 free
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved