文章目錄
- 一、字符指針的深入理解
- 二、數組指針詳解
- 三、二維數組傳參的本質
- 四、函數指針及其應用
- 五、函數指針數組與轉移表
一、字符指針的深入理解
1.1 字符指針的基本使用
字符指針(char*)是指向字符類型數據的指針,它有兩種常見的使用方式:
// 方式一:指向單個字符
char ch = 'w';
char *pc = &ch;
*pc = 'a'; // 修改ch的值為'a'// 方式二:指向字符串常量
const char* pstr = "hello bit";
printf("%s\n", pstr); // 輸出: hello bit
1.2 字符串常量的存儲特性
需要特別注意第二種使用方式中字符串常量的存儲特性:
const char *str3 = "hello bit";
const char *str4 = "hello bit";if(str3 == str4) {printf("str3和str4指向同一地址\n");
} else {printf("str3和str4指向不同地址\n");
}
二、數組指針詳解
2.1 數組指針的定義
數組指針是指向整個數組的指針,而不是指向數組元素的指針。它的定義方式如下:
int arr[10] = {0};
int (*p)[10] = &arr; // p是指向包含10個int元素的數組的指針
理解數組指針的關鍵在于運算符優先級:
[]的優先級高于*
因此int *p[10]表示指針數組(包含10個int指針的數組)
而int (*p)[10]表示數組指針(指向包含10個int元素的數組的指針)
2.2 數組指針的使用示例
#include <stdio.h>int main() {int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};int (*p)[4] = arr; // 指向第一行(一個包含4個int的數組)for(int i=0; i<3; i++) {for(int j=0; j<4; j++) {printf("%2d ", *(*(p+i)+j)); // 等價于p[i][j]}printf("\n");}return 0;
}
三、二維數組傳參的本質
3.1 二維數組的內存布局
二維數組實際上是"數組的數組",在內存中按行優先順序連續存儲。例如:
int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}
};
3.2 二維數組傳參的兩種形式
形式一:使用二維數組語法
void printArray(int arr[][4], int rows) {for(int i=0; i<rows; i++) {for(int j=0; j<4; j++) {printf("%d ", arr[i][j]);}printf("\n");}
}
形式二:使用數組指針語法
void printArray(int (*arr)[4], int rows) {for(int i=0; i<rows; i++) {for(int j=0; j<4; j++) {printf("%d ", *(*(arr+i)+j));}printf("\n");}
}
四、函數指針及其應用
4.1 函數指針的基本概念
函數指針是指向函數的指針變量,它存儲的是函數的入口地址:
#include <stdio.h>int add(int a, int b) {return a + b;
}int main() {int (*pf)(int, int) = add; // 等價于 &addprintf("%d\n", pf(2, 3)); // 輸出: 5printf("%d\n", (*pf)(3, 5)); // 輸出: 8return 0;
}
4.2 函數指針的類型解析
函數指針類型的組成:
返回類型:int
指針名稱:pf
參數類型:(int, int)
因此int (*pf)(int, int)表示:
pf是一個指針
指向一個返回int并接受兩個int參數的函數
五、函數指針數組與轉移表
5.1 函數指針數組的定義
函數指針數組是存儲多個函數指針的數組,可用于實現"轉移表":
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return a / b; }int (*funcArray[4])(int, int) = {add, sub, mul, div};