1. 指針的定義
指針(Pointer)是存儲變量地址的變量。在C語言中,指針是一種非常重要的數據類型,通過指針可以直接訪問和操作內存。
2. 指針的聲明與初始化
2.1 指針聲明
指針變量的聲明格式為:數據類型 *指針變量名;
int *ptr; // 聲明一個指向int類型的指針
char *cptr; // 聲明一個指向char類型的指針
2.2 指針初始化
指針變量初始化時,可以將變量的地址賦值給指針,使用地址運算符&
。
int a = 10;
int *ptr = &a; // 將變量a的地址賦值給指針ptr
3. 指針的使用
3.1 訪問指針所指向的變量
通過解引用運算符*
可以訪問指針所指向的變量的值。
int a = 10;
int *ptr = &a;
printf("Value of a: %d\n", *ptr); // 輸出a的值
3.2 修改指針所指向的變量
通過指針可以修改指針所指向的變量的值。
int a = 10;
int *ptr = &a;
*ptr = 20; // 修改a的值為20
printf("Modified value of a: %d\n", a); // 輸出修改后的a的值
4. 指針的運算
指針可以進行算術運算,如加減操作,但要注意指針運算的結果依賴于指針指向的數據類型。
int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf("Value at ptr: %d\n", *ptr); // 輸出1
ptr++;
printf("Value at ptr after increment: %d\n", *ptr); // 輸出2
5. 指針數組與數組指針
5.1 指針數組
指針數組是一個數組,其元素是指針。
int a = 1, b = 2, c = 3;
int *arr[3] = {&a, &b, &c};
for (int i = 0; i < 3; i++) {printf("Value at arr[%d]: %d\n", i, *arr[i]);
}
5.2 數組指針
數組指針是指向數組的指針。
int arr[3] = {1, 2, 3};
int (*ptr)[3] = &arr;
for (int i = 0; i < 3; i++) {printf("Value at ptr[%d]: %d\n", i, (*ptr)[i]);
}
6. 函數指針
函數指針是指向函數的指針,可以通過函數指針調用函數。
#include <stdio.h>void hello() {printf("Hello, World!\n");
}int main() {void (*func_ptr)() = hello; // 聲明并初始化函數指針func_ptr(); // 通過函數指針調用函數return 0;
}
7. 指針與動態內存分配
在C語言中,可以使用malloc
、calloc
、realloc
和free
函數進行動態內存分配和釋放。
#include <stdio.h>
#include <stdlib.h>int main() {int *ptr = (int*)malloc(sizeof(int) * 5); // 動態分配內存if (ptr == NULL) {printf("Memory allocation failed\n");return 1;}for (int i = 0; i < 5; i++) {ptr[i] = i + 1;}for (int i = 0; i < 5; i++) {printf("Value at ptr[%d]: %d\n", i, ptr[i]);}free(ptr); // 釋放內存return 0;
}
8. 常見指針錯誤
8.1 野指針
野指針指向未分配或已釋放的內存。
int *ptr;
*ptr = 10; // 未初始化指針,可能導致程序崩潰
8.2 空指針解引用
解引用空指針會導致程序崩潰。
int *ptr = NULL;
*ptr = 10; // 解引用空指針,可能導致程序崩潰