C——指针


C 中的指针学习起来既简单又有趣。一些 C 编程任务使用指针可以更轻松地执行,而其他任务(例如动态内存分配)如果不使用指针则无法执行。因此,要想成为一名完美的C程序员,学习指针就变得很有必要。让我们开始通过简单易行的步骤来学习它们。

如您所知,每个变量都是一个内存位置,并且每个内存位置都定义了其地址,可以使用“与”运算符(表示内存中的地址)来访问该地址。考虑以下示例,它打印定义的变量的地址 -

#include <stdio.h>

int main () {

   int  var1;
   char var2[10];

   printf("Address of var1 variable: %x\n", &var1  );
   printf("Address of var2 variable: %x\n", &var2  );

   return 0;
}

当上面的代码被编译并执行时,它会产生以下结果 -

Address of var1 variable: bff5a400
Address of var2 variable: bff5a3f6

什么是指针?

指针是一个变量,其值是另一个变量的地址,即内存位置的直接地址与任何变量或常量一样,您必须在使用指针存储任何变量地址之前声明它。指针变量声明的一般形式是 -

type *var-name;

这里,type是指针的基类型;它必须是有效的 C 数据类型,并且var-name是指针变量的名称。用于声明指针的星号 * 与用于乘法的星号相同。然而,在此语句中,星号用于将变量指定为指针。看一下一些有效的指针声明 -

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

所有指针的值的实际数据类型,无论是整数、浮点数、字符还是其他类型,都是相同的,都是表示内存地址的长十六进制数。不同数据类型的指针之间的唯一区别是指针所指向的变量或常量的数据类型。

如何使用指针?

有一些重要的操作,我们会经常借助指针来完成。(a)我们定义一个指针变量,(b)将变量的地址分配给指针,(c)最后访问指针变量中可用地址处的值。这是通过使用一元运算符*来完成的,该运算符返回位于其操作数指定的地址处的变量值。以下示例利用了这些操作 -

#include <stdio.h>

int main () {

   int  var = 20;   /* actual variable declaration */
   int  *ip;        /* pointer variable declaration */

   ip = &var;  /* store address of var in pointer variable*/

   printf("Address of var variable: %x\n", &var  );

   /* address stored in pointer variable */
   printf("Address stored in ip variable: %x\n", ip );

   /* access the value using the pointer */
   printf("Value of *ip variable: %d\n", *ip );

   return 0;
}

当上面的代码被编译并执行时,它会产生以下结果 -

Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20

空指针

如果您没有要分配的确切地址,则将 NULL 值分配给指针变量始终是一个好习惯。这是在变量声明时完成的。被赋值为 NULL 的指针称为指针。

NULL 指针是在多个标准库中定义的值为零的常量。考虑以下程序 -

#include <stdio.h>

int main () {

   int  *ptr = NULL;

   printf("The value of ptr is : %x\n", ptr  );
 
   return 0;
}

当上面的代码被编译并执行时,它会产生以下结果 -

The value of ptr is 0

在大多数操作系统中,不允许程序访问地址 0 处的内存,因为该内存由操作系统保留。不过,内存地址0有特殊意义;它表明该指针无意指向可访问的内存位置。但按照惯例,如果指针包含空(零)值,则假定它不指向任何内容。

要检查空指针,您可以使用“if”语句,如下所示 -

if(ptr)     /* succeeds if p is not null */
if(!ptr)    /* succeeds if p is null */

详细指针

指针有很多但简单的概念,它们对于 C 编程非常重要。任何 C 程序员都应该清楚以下重要的指针概念 -

先生。 概念与描述
1 指针运算

指针中可以使用四种算术运算符:++、--、+、-

2 指针数组

您可以定义数组来保存多个指针。

3 指针到指针

C 允许你在指针上放置指针等等。

4 将指针传递给 C 中的函数

通过引用或地址传递参数使得被调用函数可以在调用函数中更改传递的参数。

5 从 C 函数返回指针

C 允许函数返回指向局部变量、静态变量和动态分配内存的指针。