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

C 語言學習筆記 (三):函數參數求值、const/static、大小端判斷、指針與數組深度解析

     編輯:關於C語言

函數參數求值順序

C 標準**未規定**求值順序 (編譯器相關)。

int i = 2; max(i, i++); // 可能 max(2,2) 或 max(3,2)
// 結論:避免在參數中使用副作用表達式

值傳遞機制

  • 形參與實參佔用不同內存單元
  • 單向傳遞:形參修改不影響實參 (指針除外)

extern 作用域擴展

跨文件共享變量/函數:extern int g_var; (聲明),定義處不加 extern。

const 完全指南

聲明含義
const int *p / int const *p指向常量的指針:*p 不可改,p 可改
int *const p常量指針:p 不可改,*p 可改
const int *const p雙重常量:指針與指向值均不可改

口訣:const 靠近 * 修飾指針,否則修飾指向值。

static 多重含義

  • 函數內:靜態局部變量,生存期全局,作用域局部,隱式初始化為 0
  • 文件級:內部鏈接,僅本文件可見
  • 函數聲明:內部鏈接,僅本文件可調用

聯合體判斷大小端

int is_little_endian() {
    union { int i; char c; } u;
    u.i = 0x01;
    return u.c == 0x01; // 低地址存低位 → 小端
}

數組與指針深度解析

char *a;           // a 是指針,類型 char*
// 去掉變量名看類型:char* → 指針類型
// 去掉 * 看指向類型:char → 指向 char

int *p1[10];       // 指針數組:10 個 int*
int (*p2)[10];     // 數組指針:指向 int[10] 的指針

char a[5];
char (*p3)[5] = &a; // 正確:&a 類型 char(*)[5]
char (*p4)[5] = a;  // 錯誤:a 退化為 char* (首元素地址)
char *p5 = a;       // 正確:a 退化為 &a[0]

指針賦值兼容性原則

出現警告時,**指針類型應跟隨左操作數** (目標指針類型)。

變量作用域與存儲

  • 編譯器優化:未使用的全局變量可能不分配內存
  • 塊作用域變量:進入塊時分配,退出釋放 (VLA 例外)
  • 靜態存儲區變量 (全局/static) 無顯式初始化 → 自動歸零
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved