指针是C语言最强大也最复杂的特性之一。东巴文(db-w.cn) 将带你深入理解指针,掌握C语言的精髓。
💡 东巴文观点:指针是C语言的灵魂,它提供了直接操作内存的能力,是理解C语言高级特性的关键。
东巴文说明:指针是一个变量,其值为另一个变量的地址,即直接指向内存位置。
东巴文指针特点:
指针特点
├── 存储地址
├── 可以间接访问数据
├── 支持指针运算
├── 可以动态分配内存
└── 是C语言的灵魂
#include <stdio.h>
int main() {
printf("=== 东巴文为什么需要指针 ===\n\n");
int num = 10;
printf("直接访问:num = %d\n", num);
printf("地址访问:&num = %p\n", &num);
// 指针可以:
// 1. 间接访问变量
// 2. 在函数间传递大量数据
// 3. 动态分配内存
// 4. 操作数组和字符串
// 5. 实现复杂数据结构
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文指针声明 ===\n\n");
// 声明指针
int *intPtr; // 整型指针
double *dblPtr; // double指针
char *charPtr; // 字符指针
// 声明并初始化
int num = 10;
int *ptr = #
printf("num = %d\n", num);
printf("&num = %p\n", &num);
printf("ptr = %p\n", ptr);
return 0;
}
东巴文说明:
* 是指针声明符#include <stdio.h>
int main() {
printf("=== 东巴文指针初始化 ===\n\n");
int num = 10;
// 初始化为变量地址
int *ptr1 = #
// 初始化为NULL
int *ptr2 = NULL;
// 初始化为0
int *ptr3 = 0;
printf("ptr1 = %p\n", ptr1);
printf("ptr2 = %p\n", ptr2);
printf("ptr3 = %p\n", ptr3);
return 0;
}
东巴文说明:
#include <stdio.h>
int main() {
printf("=== 东巴文指针使用 ===\n\n");
int num = 10;
int *ptr = #
printf("num = %d\n", num);
printf("&num = %p\n", &num);
printf("ptr = %p\n", ptr);
printf("*ptr = %d\n", *ptr);
// 通过指针修改值
*ptr = 20;
printf("\n通过指针修改后:\n");
printf("num = %d\n", num);
printf("*ptr = %d\n", *ptr);
return 0;
}
东巴文说明:
& 取地址运算符* 解引用运算符#include <stdio.h>
int main() {
printf("=== 东巴文取地址与解引用 ===\n\n");
int num = 10;
int *ptr = #
// 取地址
printf("&num = %p\n", &num);
printf("ptr = %p\n", ptr);
// 解引用
printf("num = %d\n", num);
printf("*ptr = %d\n", *ptr);
// 通过指针修改
*ptr = 20;
printf("\n修改后:\n");
printf("num = %d\n", num);
printf("*ptr = %d\n", *ptr);
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文指针赋值 ===\n\n");
int num1 = 10, num2 = 20;
int *ptr;
// 指向num1
ptr = &num1;
printf("ptr指向num1:*ptr = %d\n", *ptr);
// 指向num2
ptr = &num2;
printf("ptr指向num2:*ptr = %d\n", *ptr);
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文指针与const ===\n\n");
int num = 10;
// 常量指针:指针指向的值不能修改
const int *ptr1 = #
// *ptr1 = 20; // 错误:不能修改指向的值
// 指针常量:指针本身不能修改
int * const ptr2 = #
// ptr2 = &other; // 错误:不能修改指针
// 指向常量的指针常量
const int * const ptr3 = #
// *ptr3 = 20; // 错误
// ptr3 = &other; // 错误
printf("ptr1 = %p, *ptr1 = %d\n", ptr1, *ptr1);
printf("ptr2 = %p, *ptr2 = %d\n", ptr2, *ptr2);
printf("ptr3 = %p, *ptr3 = %d\n", ptr3, *ptr3);
return 0;
}
东巴文说明:
const int *ptr - 指向常量的指针int * const ptr - 指针常量const int * const ptr - 指向常量的指针常量#include <stdio.h>
int main() {
printf("=== 东巴文指针与一维数组 ===\n\n");
int arr[] = {10, 20, 30, 40, 50};
int *ptr = arr; // 数组名是数组首元素的地址
printf("数组名:%p\n", arr);
printf("指针:%p\n", ptr);
printf("\n通过指针访问数组:\n");
for (int i = 0; i < 5; i++) {
printf("*(ptr + %d) = %d\n", i, *(ptr + i));
}
printf("\n通过数组名访问数组:\n");
for (int i = 0; i < 5; i++) {
printf("*(arr + %d) = %d\n", i, *(arr + i));
}
return 0;
}
东巴文说明:
arr[i] 等价于 *(arr + i)&arr[i] 等价于 arr + i#include <stdio.h>
int main() {
printf("=== 东巴文指针与二维数组 ===\n\n");
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 指向二维数组的指针
int (*ptr)[3] = matrix;
printf("通过指针访问二维数组:\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", ptr[i][j]);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文字符指针 ===\n\n");
// 字符数组
char str1[] = "东巴文";
// 字符指针
char *str2 = "东巴文";
printf("字符数组:%s\n", str1);
printf("字符指针:%s\n", str2);
// 修改字符数组
str1[0] = '东';
printf("修改字符数组:%s\n", str1);
// ⚠️ 不能修改字符指针指向的字符串常量
// str2[0] = '东'; // 错误:可能崩溃
return 0;
}
东巴文说明:
#include <stdio.h>
int main() {
printf("=== 东巴文指针与字符串处理 ===\n\n");
char str[] = "东巴文欢迎您";
char *ptr = str;
printf("原字符串:%s\n", str);
// 使用指针遍历字符串
printf("逐字符输出:");
while (*ptr != '\0') {
printf("%c", *ptr);
ptr++;
}
printf("\n");
return 0;
}
#include <stdio.h>
// 交换两个变量的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
printf("=== 东巴文指针作为函数参数 ===\n\n");
int num1 = 10, num2 = 20;
printf("交换前:num1 = %d, num2 = %d\n", num1, num2);
swap(&num1, &num2);
printf("交换后:num1 = %d, num2 = %d\n", num1, num2);
return 0;
}
东巴文说明:
#include <stdio.h>
// 返回较大值的地址
int *max(int *a, int *b) {
return (*a > *b) ? a : b;
}
int main() {
printf("=== 东巴文指针作为返回值 ===\n\n");
int num1 = 10, num2 = 20;
int *result;
result = max(&num1, &num2);
printf("较大值:%d\n", *result);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("=== 东巴文动态内存分配 ===\n\n");
// 动态分配内存
int *ptr = (int *)malloc(sizeof(int));
if (ptr != NULL) {
*ptr = 100;
printf("动态分配的值:%d\n", *ptr);
free(ptr); // 释放内存
}
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文指针与数组操作 ===\n\n");
int arr[] = {10, 20, 30, 40, 50};
int *ptr = arr;
printf("数组元素:\n");
for (int i = 0; i < 5; i++) {
printf(" arr[%d] = %d, *(ptr + %d) = %d\n",
i, arr[i], i, *(ptr + i));
}
// 指针运算
ptr++;
printf("\nptr++后:*ptr = %d\n", *ptr);
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文初始化指针 ===\n\n");
// ✅ 推荐:初始化为NULL
int *ptr1 = NULL;
// ✅ 推荐:初始化为变量地址
int num = 10;
int *ptr2 = #
// ❌ 不推荐:未初始化
// int *ptr3; // 野指针
printf("ptr1 = %p\n", ptr1);
printf("ptr2 = %p, *ptr2 = %d\n", ptr2, *ptr2);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("=== 东巴文检查NULL ===\n\n");
int *ptr = (int *)malloc(sizeof(int));
// ✅ 正确:检查NULL
if (ptr != NULL) {
*ptr = 100;
printf("分配成功:%d\n", *ptr);
free(ptr);
} else {
printf("内存分配失败\n");
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("=== 东巴文避免野指针 ===\n\n");
int *ptr = (int *)malloc(sizeof(int));
if (ptr != NULL) {
*ptr = 100;
printf("值:%d\n", *ptr);
free(ptr);
// ✅ 正确:释放后置NULL
ptr = NULL;
}
return 0;
}
完成本章学习后,请确认:
掌握指针后,你可以继续学习:
如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!
东巴文(db-w.cn) - 让编程学习更简单
🎯 东巴文指针提示:指针是C语言的灵魂,掌握指针是成为C语言高手的关键。在 db-w.cn,我们会通过大量实例帮你掌握指针的使用!