亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

精通C语言指针:专家级实战教程

精通C语言指针

深入探索C语言指针的核心概念,从内存地址到实战示例及常见陷阱,助力开发者通过真实代码加深理解。

指针是高效C语言编程的基石。在深入指针之前,让我们先回顾C语言中内存地址的工作原理。


C语言中的内存地址

对于变量 var,表达式 &var 可获得 var 存储的内存地址。

地址操作常见于 scanf() 中:

scanf("%d", &var);

这将用户输入直接存入 var 的内存位置。快速演示:

#include <stdio.h>
int main() {
    int var = 5;
    printf("var: %d\n", var);
    printf("address of var: %p", &var);
    return 0;
}

输出

var: 5
address of var: 0x7fffc1a2b1c8

注意: 地址每次运行和系统都不同。


什么是指针?

指针是一个存储内存地址而非常规值的变量。通过存储地址,指针实现对数据的间接访问,从而支持动态内存管理、高效数据结构和底层系统控制。

声明指针

典型声明语法:

int *p;

常见变体:

int *p1; int *p2;

星号周围的空格不影响声明。但要注意逗号分隔的声明:

int *p1, p2; /* p1 是指针,p2 是 int */

给指针赋地址

示例:

int *pc, c;
c = 5;
pc = &c;

这里 c 获得值 5,pc 存储 c 的地址。


解引用指针

使用解引用运算符 * 访问指针指向地址处的值:

int *pc, c;
c = 5;
pc = &c;
printf("%d", *pc); /* 打印 5 */

记住,pc 是指针;*pc 获取其指向的值。尝试将地址赋给 *pc(如 *pc = &c;)是无效的。

* 运算符称为解引用运算符。


通过指针修改值

可以通过指针改变底层数据:

int *pc, c;
c = 5;
pc = &c;
*pc = 1; /* c 变为 1 */
printf("%d", c); /* 打印 1 */

重新赋值后,多个变量可共享同一指针:

int *pc, c, d;
c = 5;
d = -15;
pc = &c;
printf("%d", *pc); /* 5 */
pc = &d;
printf("%d", *pc); /* -15 */

实战示例

运行完整程序观察指针值保持不变而其引用的数据可变:

#include <stdio.h>
int main() {
    int *pc, c;
    c = 22;
    printf("Address of c: %p\n", &c);
    printf("Value of c: %d\n\n", c);
    pc = &c;
    printf("Address of pointer pc: %p\n", pc);
    printf("Content of pointer pc: %d\n\n", *pc);
    c = 11;
    printf("Address of pointer pc: %p\n", pc);
    printf("Content of pointer pc: %d\n\n", *pc);
    *pc = 2;
    printf("Address of c: %p\n", &c);
    printf("Value of c: %d\n\n", c);
    return 0;
}

输出

Address of c: 0x7fffc1a2b1c8
Value of c: 22
Address of pointer pc: 0x7fffc1a2b1c8
Content of pointer pc: 22
Address of pointer pc: 0x7fffc1a2b1c8
Content of pointer pc: 11
Address of c: 0x7fffc1a2b1c8
Value of c: 2

解析

  1. int *pc, c; – 声明指针 pc 和 int c。
  2. c = 22; – 在 c 的内存存储 22。
  3. pc = &c; – 让 pc 指向 c。
  4. c = 11; – 通过直接访问更新值。
  5. *pc = 2; – 通过指针改变值。

指针常见错误

典型错误包括混淆指针和值:

int c, *pc; // 错误 – 将值赋给指针
pc = c; // Error
// 错误 – 试图将地址赋给解引用指针
*pc = &c; // Error
// 正确 – 将地址赋给指针
pc = &c; // OK
// 正确 – 将值赋给指针指向的位置
*pc = c; // OK

对初学者,int *p = &c; 可能令人困惑。它等价于:

int *p;
p = &c;

写成 int* p = &c; 可减少歧义。


理解指针后,你将准备好探索指针与数组的关系(见下一教程)。


C语言

  1. C# Hello World — 构建你的第一个C#应用程序
  2. C#关键字与标识符:规则、完整列表与最佳实践
  3. 精通C#变量与基础数据类型:完整指南
  4. C#运算符——C#运算符全面指南
  5. 掌握 C# 位运算与移位运算符:全面指南
  6. C# 基础:输入输出核心技巧完全指南
  7. C# 表达式、语句与代码块:全面指南与实战示例
  8. 掌握 C# 注释:类型、最佳实践与 XML 文档注释
  9. 精通C语言指针:专家级实战教程
  10. 深入理解C语言数组与指针的关系
  11. C语言函数参数传递:地址与指针实战指南
  12. 精通C语言结构体与指针:实战指南