int a[3][4];
int (*p)[4] = a; // p 指向首行,類型 int (*)[4]
// p+i -> 第 i 行
// *(p+i) -> 第 i 行數組,退化為 int* 指向行首
// *(*(p+i)+j) -> a[i][j]
int (*p)[4] vs int *p[4](指針數組)。
int a[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
int (*p)[4] = a;
for (int i=0; i<3; ++i)
for (int j=0; j<4; ++j)
printf("%2d ", *(*(p+i)+j));
char *ps = "C Language"; // 指向字面量(只讀區)
// 等價分兩步
char *ps; ps = "C Language";
// 指針算術跳過前綴
ps += 10; // 指向 "guage"
printf("%s\n", ps); // guage
| 特性 | 字符串指針 char *ps | 字符數組 char str[] |
|---|---|---|
| 存儲 | 指針變量存地址,字符串在只讀區/堆 | 數組元素直接存字符,棧/靜態區 |
| 初始化 | char *ps = "abc"; 合法 | 需靜態/外部:static char str[] = "abc"; |
| 賦值 | ps = "new"; 合法(改指向) | str = "new"; 非法,需逐字符拷貝 |
| 修改 | 指向字面量時不可改;指向堆/棧可改 | 隨時可改 |
| sizeof | 指針大小 (4/8) | 數組總字節數 |
// 只讀輸入用 const
void print_str(const char *s) {
while (*s) putchar(*s++);
}
// 需修改目標緩衝區
void my_strcpy(char *dst, const char *src) {
while (*dst++ = *src++);
}
函數名 = 函數入口地址。可賦值給函數指針變量,通過它調用函數。
返回類型 (*指針變量名)(參數列表);
int max(int a, int b) { return a>b?a:b; }
int main() {
int (*pmax)(int, int) = max; // 賦值函數地址
int x=3, y=5, z;
z = (*pmax)(x, y); // 調用:(*指針)(實參)
// 或 z = pmax(x, y); // C 允許隱式解引用
printf("max=%d\n", z);
return 0;
}
int (*p)(int,int) 是函數指針;int *p(int,int) 是返回指針的函數聲明。++/--/+n,無意義。(*pmax)(x,y) 或 pmax(x,y)。
返回類型 *函數名(參數列表);
const char *day_name(int n) {
static const char *names[] = {
"Illegal", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"
};
return (n<1 || n>7) ? names[0] : names[n];
}
int main() {
int d;
scanf("%d", &d);
if (d < 0) return 1;
printf("Day %d -> %s\n", d, day_name(d));
return 0;
}
| 項目 | 函數指針變量 | 指針函數 |
|---|---|---|
| 聲明 | int (*p)(int,int); | int *p(int,int); |
| 本質 | 變量,存函數地址 | 函數,返回指針值 |
| 括號位置 | (*p) 綁定標識符 | *p 綁定返回類型 |
| 用途 | 回調、策略模式、狀態機 | 工廠函數、查找返回指針 |
數組元素為指針。常用於存儲字符串指針集合。
int *pa[3]; // 3 個 int*
char *names[8] = { // 字符串指針數組
"Illegal", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"
};
#include
void sort(char *name[], int n) {
for (int i=0; i 0) k = j;
if (k != i) {
char *tmp = name[i];
name[i] = name[k];
name[k] = tmp; // 僅交換指針,極快
}
}
}
void print(char *name[], int n) {
for (int i=0; i
int (*p)[N] 攜帶列數,高效計算行偏移。const 表達只讀意圖。返回類型 (*名)(參數),括號定乾坤。