拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

指针本质与应用精髓

指针本质与应用精髓

指针总结

1. 指针是什么?

指针是地址,即内存单元的编号。它是一种数据类型,专门用来处理“地址”这种数据。

指针与普通变量的区别

特性普通变量指针变量
存储内容数据值内存地址
用途存储数据存储地址,用于间接访问数据

定义指针变量

int *p; // 定义一个指向 int 类型的指针变量 p
  • int:基类型,表示指针所指向的数据类型。
  • *:定义指针时的符号,表示该变量是一个指针。
  • p:指针变量名。

指针的大小

系统地址大小(字节)
32位系统4
64位系统8

2. 指针的使用

获取变量的地址

int a = 10; int *p = &a; // p 存储了 a 的地址

解引用操作(*)

*p = 20; // 修改 a 的值为 20

指针运算

运算说明
p + 1地址增加一个基类型大小
p - 1地址减少一个基类型大小
p - q计算两个指针之间的差值(需同类型)
p > q比较地址大小

3. 指针与数组

数组与指针的关系

  • 数组名代表首元素的地址,即a == &a[0]。
  • 通过指针可以访问数组元素:
    int a[5] = {1, 2, 3, 4, 5}; int *p = a; printf("%d

", *(p + 2)); // 输出 3

### 一维数组 - 通过指针遍历数组: ```c for (int i = 0; i < 5; i++) { printf("%d ", a[i]); }

二维数组

  • 二维数组的指针形式:

    int a[3][4]; int (*p)[4] = a; // 指向一个包含 4 个 int 的数组
  • 通过指针访问二维数组元素:

    printf("%d

", p[1][2]); // 等价于 a[1][2]

--- ## 4. 指针与函数参数 ### 值传递 vs 地址传递 | 传递方式 | 是否能修改主调变量 | 说明 | |----------|--------------------|------| | 值传递 | 否 | 传递的是变量的副本 | | 地址传递 | 是 | 传递的是变量的地址,可修改主调变量 | ### 示例:通过指针修改主调变量 ```c void addOne(int *p) { *p = *p + 1; } int main() { int n = 10; addOne(&n); // 通过地址传递,修改 n 的值 printf("n = %d ", n); // 输出 11 return 0; }

5. 指针的高级应用

指针数组

  • 指针数组是数组中的元素是指针。
    char *strs[3] = {"Hello", "World", "C"};

数组指针

  • 数组指针是指向整个数组的指针。
    int a[3][4]; int (*p)[4] = a; // p 指向 a 的第一行

多重指针 指针的指针(二级指针):

int a = 10; int *p = &a; int **pp = &p; // pp 是指向指针 p 的指针 printf("%d ", **pp); // 输出 10

6. 指针的常见问题

问题说明
空指针指针未初始化或指向无效地址,可能导致程序崩溃
指针越界操作超出数组范围,导致未定义行为
内存泄漏动态分配的内存未释放,导致资源浪费

7. 指针的应用场景

应用场景说明
动态内存分配使用malloc、calloc等函数分配和释放内存
字符串处理通过指针操作字符串,如strcpy、strlen等
函数参数传递通过地址传递实现被调函数对主调函数变量的修改
数据结构表示复杂的数据结构,如链表、树、图等

8. 指针的优缺点

优点缺点
高效访问内存使用不当容易出错
支持动态内存管理学习难度较高
可以直接操作硬件指针越界、空指针等问题难以调试

9. 指针的总结

项目内容
指针本质地址,用于间接访问内存
指针类型根据所指向的数据类型定义
指针运算支持加减、比较等操作
指针与数组数组名是首元素地址,指针可用于遍历数组
指针与函数通过地址传递实现被调函数对主调函数变量的修改
指针的高级应用指针数组、数组指针、多重指针等

指针是 C 语言的核心特性之一,掌握指针是学习 C 语言的关键。


参考来源

  • C语言数组之指针数组和数组指针
  • C语言中指针和数组详解
  • C语言指针数组和数组指针详解
  • C语言指针操作(三)通过指针引用数组
  • C语言指针操作(九)指针数组和多重指针
返回列表