前言:
文接上章,在上章節講解了部分指針知識點,在本章節為大家繼續提供。
六·指針與字符串:C 語言字符串的本質
在 C 語言中,字符串實際上是一個以\0
結尾的字符數組。字符串常量本質上是指向字符數組首元素的指針:
char *str = "Hello, World!"; // 字符串常量存儲在只讀內存區
printf("%s\n", str); // 輸出Hello, World!
printf("首字符:%c\n", *str); // 輸出H
printf("第3個字符:%c\n", *(str + 2)); // 輸出l
動態分配字符串:?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{char *str = (char *)malloc(20 * sizeof(char)); // 動態分配20字節內存if (str == NULL)
{printf("內存分配失敗\n");return 1;}strcpy(str, "Dynamic String"); // 復制字符串到分配的內存printf("%s\n", str); // 輸出Dynamic Stringfree(str); // 釋放內存,防止內存泄漏return 0;
}
malloc函數在內存函數中講解過,想要詳細了解的可以點開主頁,看一下文章。?
七·多級指針:指針的指針
指針變量本身也有自己的內存地址,因此可以定義指向指針的指針(多級指針):
int num = 10;
int *p = # // 一級指針,指向int
int **pp = &p; // 二級指針,指向int*
int ***ppp = &pp; // 三級指針,指向int**printf("num的值:%d\n", ***ppp); // 解引用三次,輸出10
多級指針常用于需要修改一級指針本身的場景,比如動態分配二維數組:
int **matrix;
int rows = 3, cols = 4;// 分配行指針數組
matrix = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++)
{// 為每一行分配列元素matrix[i] = (int *)malloc(cols * sizeof(int));
}// 使用二維數組
matrix[0][0] = 100;// 釋放內存
for (int i = 0; i < rows; i++)
{free(matrix[i]);
}
free(matrix);
八·常見指針錯誤
野指針:未初始化的指針
int *p;
*p = 10; // 錯誤!p指向隨機地址
空指針解引用:
int *p = NULL;
*p = 10; // 錯誤!解引用空指針
內存泄漏:動態分配的內存未釋放
int *p = (int *)malloc(sizeof(int));
// 使用p
// 忘記free(p)
?九·總結
?
- 指針變量存儲的是內存地址
- 通過解引用操作符
*
可以訪問和修改內存中的數據 - 指針算術允許在內存中移動
- 指針是實現數組、字符串、動態內存分配和復雜數據結構的基礎
- 使用指針時必須特別注意內存管理和避免常見錯誤
?
?
?