C语言中的指针定义

2025年3月17日 | 阅读 7 分钟

什么是指针?

指针是C语言中一种特殊的变量,用于存储另一个变量的地址。指针可以是任何数据类型,如int、float、char、string、array或function。在C语言中,指针用星号(*)表示。指针的大小取决于架构。例如,对于32位机器,指针的大小为4字节;对于64位机器,指针的大小为8字节。

C语言指针的特点

  • 指针用于节省计算机内存
  • 它提供内存地址的直接访问,从而节省时间。
  • 指针与数据结构一起使用,例如链表。
  • 使用指针进行内存的动态分配和释放。

C语言中声明指针的语法

  • 数据类型 * 变量名;

指针数组

C语言中的指针数组是多个指针的集合,表示如下:

  • 数据类型 * 变量名[大小];

在C语言中,数组和指针是相关的,因为数组名像一个指针常量。指针常量的值是第一个元素的地址。例如,我们有一个名为ptr的数组,那么ptr&ptr[0]表示相同的含义,我们可以同时使用它们。

将此值赋给指向数组的非const指针,我们可以使用此指针访问数组的元素。

让我们看一个使用int数据类型的指针数组的例子。

输出

Elements of the array are 1 2 3 4 5

这是使用string数据类型的指针数组的另一个示例。

输出

The locations of the strings are:
4310680
4310684
4310688
4310692
4310696

'&'和'*'运算符

'&'运算符-当你给一个变量赋值时,它存储在一个特定的内存地址。要访问该内存地址,我们使用'&'运算符。因此,我们可以说'&'运算符,也称为“取地址”运算符或引用运算符,用于给出变量的内存地址

Pointer Definition in C

输出

0x77fee2365f099 // memory address of the variable 'marks'. (Note: Output varies from computer to computer as memory address assigned by your computer will be different.)

注意:%p是用于打印指针值的格式说明符。这里 &marks是一个指针。

'*'运算符- '*'运算符或解引用运算符用于获取给定地址处变量的值。'*'运算符基本上有两个功能。在声明中使用'*'时,它用于创建指针;否则,它用作解引用运算符。下面是一个展示'*'运算符两种功能的示例。

Pointer Definition in C

输出

75

C语言中指针的类型

Pointer Definition in C

空指针

空指针是没有赋值的指针。空指针不指向任何函数或对象。这意味着该指针未被赋值为任何有效内存地址。

输出

The value inside the pointer ptr is:
0

野指针

当你没有初始化指针时,该指针称为野指针。这种类型的指针可能导致程序崩溃,因为指针将被赋值为随机内存地址。

void指针

void指针是没有特定数据类型的指针。它使用void关键字创建。

悬空指针

当你使用free()函数释放指针的内存时,该指针称为悬空指针。

C语言中指针的算术运算

并非所有操作都可以对指针执行,只有少数一组操作可以。指针算术是指可以对指针执行的操作集合。它不同于我们用于常规数学表达式的操作。操作如下:

  • 指针递增:指针递增是指指针从一个索引跳转到数组中的下一个索引。

表示为ptr++;

输出

Value of *ptr = 20
Value of *ptr = 30
Value of *ptr = 40
  • 指针递减:指针递减是指从一个索引跳转到数组的前一个索引。

表示为ptr--;

输出

Value of *ptr = 40
Value of *ptr = 30
Value of *ptr = 20
  • 将数字添加到指针:将数字x添加到指针会使指针增加x倍于变量数据类型的字节数。

让我们看一个例子

假设val的内存地址是200,那么newval的地址将是208,而不是202,即ptr+2*sizeof(int),其中int的大小是4字节。

  • 从指针减去整数:从指针中减去整数遵循与上面为加法提到的相同的规则。
  • 减去两个指针:只有当它们的数据类型相同时,才能减去两个指针。减去两个指针的结果是减去两个指针的内存地址,然后根据指针数据类型计算数据位数。减去两个指针会给出两个指针之间的增量。
    让我们举一个例子,其中一个整型指针ptr1的内存地址为100,另一个整型指针ptr2的内存地址为104,需要减去它们。它们内存地址之间的差值为4。由于int数据类型的大小是4,结果将是4/4,即1。因此,两个指针之间的增量是1。
  • 指针比较:只有当两个指针具有相同数据类型时,才能进行比较。我们可以使用C语言支持的所有关系运算符(<、>、<=、>=、!=、==),结果将是true或false。

输出

val2 is greater than val1

指针的优点

  • 借助指针可以轻松访问内存位置。
  • 借助指针可以轻松访问数组的元素。
  • 指针用于动态内存分配和释放。
  • 指针用于创建其他数据结构,如链表、图和树。

指针的缺点

  • 指针对用户来说有点难以理解。
  • 由于指针有点复杂,它们可能会导致段错误等错误,或者它们可能会访问不必要的内存位置。
  • 指针可能导致内存泄漏。
  • 给指针赋一个错误的值可能会导致内存损坏。
  • 指针相对较慢。
  • 程序员操作指针是一项艰巨的任务。

下一主题Staff Definition