C 语言指针解引用和取地址运算符的区别

2025年5月11日 | 阅读 4 分钟

在C语言中,有两个运算符用于处理内存:取地址运算符(&)指针解引用运算符(*)。取地址运算符返回变量的地址,即变量在内存中的存储位置。像这样的语句:int *ptr = &x; 会获取x的地址并将其赋值给ptr。指针解引用则获取指针所指向内存地址中的值。*ptr = 10; 会修改ptr所指定位置的信息。因此,&用于获取地址,而*用于获取或设置该位置的值;这使得动态且有用的内存操作成为可能。

取地址运算符(&)

  • 一元取地址运算符(&)可以用来确定变量的内存位置。换句话说,它“指向”变量的值在内存中存储的位置。
  • 目的: 找到变量的内存地址。

语法

它具有以下语法:

指针解引用(*)

  • 指针解引用是指检索指针所指向内存位置中存储的值的过程。使用解引用运算符(*),可以读取或修改该内存位置的值。
  • 目的: 读取或修改特定内存位置中存储的值。

语法

它具有以下语法:

指针解引用(*)

  • 指针解引用是指检索指针所指向内存位置中存储的值的过程。使用解引用运算符(*),可以读取或修改该内存位置的值。
  • 目的: 读取或修改特定内存位置中存储的值。

语法

它具有以下语法:

取地址运算符和指针解引用之间的主要区别

C语言中的取地址运算符和指针解引用之间有几个主要区别。以下是一些主要区别:

方面取地址运算符(&)指针解引用(*)
目的它检索变量的内存地址。它修改或访问内存位置的值。
操作数它操作数组元素或变量。它使用指向函数的指针。
结果它生成内存地址。它生成存储在内存地址中的值。
用途它使一个变量成为指针。它使用指针访问数据。
表达&x (x的地址)*ptr (ptr内存地址中的值)

示例用法

示例 1

让我们用一个例子来说明C语言中的取地址运算符和指针解引用。

输出

 
Address of num: 0x7fffb45798f4
Address stored in ptr: 0x7fffb45798f4
Value of num: 25
Value accessed through ptr: 25
New value of num after modification: 50
Value of num through ptr2: 50   

说明

  • &num:它获取num在内存中的地址。
  • *ptr:*ptr访问或修改ptr所指向的内存地址。
  • **ptr2:要获取num的值,ptr2演示了如何解引用指针的指针。

示例 2

让我们再用一个例子来说明C语言中的取地址运算符和指针解引用。

输出

 
Address of arr[0]: 0x7ffc4dbc4f3c
Address stored in ptr: 0x7ffc4dbc4f3c
Value at ptr (arr[0]): 10
New value at ptr (arr[0]): 15
Value at ptr (arr[1]): 20
Value at ptr (arr[2]): 30   

说明

  • &arr[0]:使用&arr[0]获取数组第一个元素的内存位置。
  • *ptr:它检索指针所对应内存地址中存储的值。
  • ptr++:它将指针移动到下一个数组元素,以演示指针算术。
  • (*ptr):通过指针解引用(*ptr)动态访问和修改数组元素。

结论

总之,要实现良好的内存管理和C语言中的动态编程,必须理解取地址运算符(&)指针解引用(*)。&运算符用于获取一个变量的内存位置。通过对指针使用*运算符,可以访问或修改指针所指向内存地址中存储的值。这些操作协同工作,实现了指针的指针、动态数据操作和有效的数组处理等复杂的内存安排。理解这些概念能为我们学习更高级的C语言编程做好准备,并帮助我们理解在底层编程中内存是如何被访问和管理的。