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

C 語言進階:指標、const、動態記憶體、字串函數手寫實現全解析

     編輯:關於C語言

C 語言進階:指標、const、動態記憶體、字串函數手寫實現全解析

指標是 C 語言靈魂。本文系統梳理指標運算、const 修飾語義、動態記憶體管理、標準字串函數手寫實現,建立扎實底層功力。

一、指標核心應用場景

  1. 交換變數:void swap(int *a, int *b)。
  2. 函數返回多值:輸出參數傳指標 (如 minmax(arr, len, &min, &max))。
  3. 狀態碼 + 結果分離:int divide(int a, int b, int *res) 返回成功/失敗,結果經指標回傳。
  4. 避免大結構體傳值複製:傳 const Struct *。

二、指標與 const 組合語義

宣告含義可修改
const int *p / int const *p指向常量整數p (指標), *p (值) 不可
int *const p常量指標 (指標本身不可變)*p (值), p 不可
const int *const p雙重常量p, *p 均不可

判斷口訣:**const 在 * 右邊修飾指標,左邊修飾值**。

三、指標運算規則

  • p + 1:地址增加 sizeof(*p),指向下一個同類型元素。
  • p - q:返回元素個數差 (型別為 ptrdiff_t)。
  • 僅對**連續分配陣列**有意義,單獨變數指標運算未定義。
  • *p++:取值後指標後移 (後綴 ++ 優先級高於 *)。

四、動態記憶體管理

#include <stdlib.h>
void *malloc(size_t size);   // 分配 size 字節,未初始化
void *calloc(size_t n, size_t sz); // 分配 n*sz 並歸零
void *realloc(void *ptr, size_t size); // 調整大小
void free(void *ptr);        // 釋放,ptr 必須來自 malloc 系

核心原則

  • 檢查返回值:if (!p) handle_error();。
  • 配對釋放:每個 malloc 對應一個 free。
  • 釋放後置 NULL:free(p); p = NULL; 避免懸空指標二次釋放。
  • 只能釋放首地址:free(p+2) 崩潰。

五、字串函數手寫實現 (面試必考)

strlen

size_t my_strlen(const char *s) {
    size_t len = 0;
    while (s[len]) len++;
    return len;
}

strcmp

int my_strcmp(const char *s1, const char *s2) {
    while (*s1 && *s1 == *s2) { s1++; s2++; }
    return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}

strcpy

char *my_strcpy(char *dest, const char *src) {
    char *ret = dest;
    while ((*dest++ = *src++)); // 包含 '\0'
    return ret;
}

strchr / strrchr / strstr

char *my_strchr(const char *s, int c) {
    while (*s && *s != c) s++;
    return (*s == c) ? (char*)s : NULL;
}

// strstr 簡易版
char *my_strstr(const char *h, const char *n) {
    if (!*n) return (char*)h;
    for (; *h; h++)
        if (*h == *n) {
            const char *a=h, *b=n;
            while (*a && *a==*b) { a++; b++; }
            if (!*b) return (char*)h;
        }
    return NULL;
}

strcat

char *my_strcat(char *dest, const char *src) {
    char *d = dest;
    while (*d) d++; // 找尾部
    while ((*d++ = *src++));
    return dest;
}

六、字元 I/O 與字串輸入

  • int getchar(void):讀一字元,EOF (-1) 表示結束 (Unix Ctrl+D, Windows Ctrl+Z)。
  • int putchar(int c):寫一字元。
  • 字串輸入:**避免 gets** (無邊界檢查),用 fgets(buf, sizeof(buf), stdin)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved