C 指针

C语言指针知识点详解 – 小白友好版

C语言指针知识点详解

编程小白也能理解的指针知识汇总

指针是C语言中最重要也是最难理解的概念之一。本指南将用最通俗易懂的语言解释指针的核心概念,帮助你真正理解指针的本质。

📖 生活比喻:

想象你有一个朋友住在某个小区,你知道他家的具体地址(比如”阳光小区3栋502″),这个地址就像是一个指针。你可以根据这个地址找到你朋友的家(实际的数据)。指针就是存储内存地址的变量。

🔍 指针是什么?

指针就是存储内存地址的变量

在计算机中,所有数据都存储在内存中,每个内存位置都有一个地址(就像每栋房子有地址一样)。指针就是存储这些地址的变量。

0x1000
42
➡️
指针 ptr
0x1000
// 指针声明与初始化 int num = 42; // 一个普通的整数变量 int *ptr; // 声明一个指向整数的指针 ptr = # // 把num的地址赋值给指针ptr

💡 & 是取地址运算符,用来获取变量的内存地址

💡 * 有两个含义:声明指针和解引用运算符

🎯 指针的基本操作

1. 声明指针

int *int_ptr; // 指向整型的指针 float *float_ptr; // 指向浮点数的指针 char *char_ptr; // 指向字符的指针

2. 初始化指针

int num = 10; int *ptr = # // 声明时初始化 int *ptr2; // 先声明 ptr2 = # // 后赋值

3. 解引用指针

使用 * 运算符访问指针指向的值:

int value = *ptr; // 获取ptr指向的值(10) *ptr = 20; // 修改ptr指向的值为20

📝 示例:

int a = 5; int *p = &a; // p指向a printf(“%d\n”, a); // 输出5 printf(“%d\n”, *p); // 输出5(解引用) *p = 10; // 通过指针修改a的值 printf(“%d\n”, a); // 输出10

📊 指针与数组

数组名实际上是一个指向数组第一个元素的指针:

int numbers[5] = {10, 20, 30, 40, 50}; int *ptr = numbers; // 等同于 &numbers[0] // 访问数组元素 printf(“%d\n”, *ptr); // 输出10(第一个元素) printf(“%d\n”, *(ptr+1)); // 输出20(第二个元素)

💡 指针运算:ptr+1 指向下一个元素(不是下一个字节)

💡 数组下标 arr[i] 等同于 *(arr+i)

指针遍历数组

int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; for(int i = 0; i < 5; i++) { printf("%d ", *p); // 访问当前元素 p++; // 移动到下一个元素 }

🧩 指针与函数

1. 指针作为函数参数

通过指针可以在函数内部修改外部变量的值:

// 函数声明 void swap(int *a, int *b); int main() { int x = 5, y = 10; swap(&x, &y); // 传递变量的地址 // 现在x=10, y=5 } void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; }

2. 指针作为函数返回值

int* createArray(int size) { int *arr = (int*)malloc(size * sizeof(int)); // … 初始化数组 return arr; // 返回数组首地址 }

⚠️ 注意:不要返回局部变量的地址!

// 错误示范! int* badFunction() { int num = 10; return # // 函数结束后num被销毁,地址无效 }

🧠 指针的高级概念

1. 指针的指针(二级指针)

指向指针的指针:

int num = 42; int *ptr = # int **pptr = &ptr; // 指向指针的指针 // 访问 printf(“%d”, **pptr); // 输出42

2. 指针数组

数组中每个元素都是指针:

int a = 1, b = 2, c = 3; int *arr[3] = {&a, &b, &c}; // 指针数组 printf(“%d”, *arr[0]); // 输出1

3. 函数指针

指向函数的指针:

int add(int a, int b) { return a + b; } int main() { int (*func_ptr)(int, int); // 声明函数指针 func_ptr = &add; // 指向add函数 int result = func_ptr(3, 4); // 调用函数 printf(“%d”, result); // 输出7 }

💾 动态内存分配

使用指针管理动态分配的内存:

#include <stdlib.h> // 分配内存 int *arr = (int*)malloc(5 * sizeof(int)); // 分配5个整数的空间 if(arr == NULL) { // 内存分配失败处理 } // 使用内存 for(int i = 0; i < 5; i++) { arr[i] = i * 10; } // 释放内存 free(arr); arr = NULL; // 避免野指针

💡 malloc – 分配内存

💡 calloc – 分配并清零内存

💡 realloc – 重新分配内存

💡 free – 释放内存

⚠️ 常见错误:

  • 忘记释放内存(内存泄漏)
  • 使用已释放的内存
  • 重复释放同一块内存
  • 访问越界的内存

💡 学习指针的关键:多练习、多思考、多画内存图!

© 2023 C语言指针指南 | 编程小白友好版

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部