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

C語言基礎教程(二):指針變量初始化與賦值完全指南

     編輯:關於C語言

指針變量初始化

指針變量聲明後必須初始化才能安全使用。初始化方式有三種:

  1. 聲明時初始化
  2. 賦值語句初始化
  3. 函數返回值初始化 (如 malloc())

1. 聲明時初始化示例


int *i = 7899;         // ⚠️ 危險:直接指向固定地址 7899 (除非內存映射硬件)
float *f = 3.1415926;  // ❌ 錯誤:將浮點常量值作為地址
char *s = "Good";      // ✅ 正確:字符串常量 "Good\0" 存儲在只讀區,s 指向首字符 'G'

關鍵區別:

  • int *i = 7899 將 i 指向絕對地址 0x1ED3,**極度危險**,除非做設備驅動。
  • char *s = "Good" 讓 s 指向字符串字面量首地址,**合法且常用**。字符串常量自動添加 \0,存儲在只讀數據段,不可修改內容。

2. 賦值語句初始化 (標準做法)


int a = 100;
int *ptr = &a;      // ✅ 取變量地址賦給指針
ptr = NULL;         // ✅ 空指針,表示不指向任何對象
ptr = 0;            // ✅ 等價 NULL (C標準保證)

變量賦值詳解

1. 基本類型變量賦值


int a, m;
float n;
a = 100;
m = 20;
n = a * m * 0.1;    // 隱式類型提升:int→float 運算

// 連續賦值 (Turbo C 2.0 支持)
int x, y, z;
x = y = z = 0;      // 右結合:z=0 → y=0 → x=0

2. 字符型變量賦值三種形式


char c0, c1, c2;
c0 = 'b';           // 字符字面量
c1 = 50;            // ASCII 碼值 (十進制) → '2'
c2 = '\x0D';        // 十六進制轉義序列 → 回車符 (CR)

3. 指針型變量賦值


int *pi;
char *ps;
*pi = 100;          // ❌ 錯誤:pi 未初始化,解引用野指針!
pi = malloc(sizeof(int));  // ✅ 先分配內存
*pi = 100;          // ✅ 現在安全:向分配區寫入 100

ps = "Good";        // ✅ 指向字符串常量
// *ps = 'g';       // ❌ 運行時錯誤:嘗試修改只讀內存

深度解析:char *s = "Good" 內存模型

編譯階段:
1. 在目標文件 .rodata 段分配 5 字節:'G' 'o' 'o' 'd' '\0'
2. 記錄該字符串首地址 (假設 0x00402000)

運行階段:
3. 將地址 0x00402000 賦給變量 s
4. s 指向 'G',s[1]='o',s[4]='\0'

內存圖:
s (棧上) → 0x00402000 (只讀數據段)
                ↓
             ['G']['o']['o']['d']['\0']

避坑清單:指針初始化與賦值十大錯誤

#錯誤代碼問題修正
1int *p; *p = 10;野指針解引用先 p = &var 或 malloc
2char *s = "abc"; s[0] = 'x';修改只讀內存用 char s[] = "abc"; (數組在棧上可修改)
3int *p = 100;整數作地址int *p = &var; 或 malloc
4free(p); *p = 1;使用後釋放釋放後置 p = NULL
5char *p = malloc(10); strcpy(p, "hello"); free(p); free(p);重複釋放釋放後置 NULL,免費檢查
6int a[10]; int *p = a; p++;修改數組名 (常量指針)用臨時指針 int *q = a; q++;
7void *vp = &i; *vp = 20;void* 直接解引用*(int*)vp = 20;
8int *p = (int*)malloc(n); // 忘檢查NULL分配失敗未判斷if(!p) return ERROR;
9char *p = "str"; p++;修改指向字符串常量的指針 (指針本身可改,但易混淆)明確語義:const char *p = "str";
10int *p = &a; int *q = p; free(p); *q = 1;雙重釋放/懸空指針明確所有權,單一釋放點

最佳實踐總結

  1. 聲明即初始化:int *p = NULL; 或 int *p = &var;
  2. 解引用前必判空:if (p) *p = val;
  3. 字符串常量用 const:const char *msg = "text"; 編譯器防誤改
  4. 動態內存:分配→檢查→使用→釋放→置NULL 完整生命周期
  5. 區分「指針值」(地址)與「指向值」(內容):p vs *p

掌握指針初始化與賦值的本質,是避開 C 語言「內存陷阱」的第一道防線。請反覆研讀避坑表,直到形成肌肉記憶!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved