C语言中指针的解引用



C语言中指针的解引用

**解引用运算符** 用于访问和操作由指针指向的变量中存储的值。**解引用**或**间接运算符**(***) 充当一元运算符,它需要一个指针变量作为其操作数。

语法

以下是解引用指针的语法:

*pointer_variable;

借助上述语法(解引用指针),您可以获取和更新任何由指针指向的变量的值。

如何解引用指针?

要解引用指针,您需要按照以下步骤操作:

  • 创建一个变量并声明一个指针变量。
  • 通过赋值变量的地址来初始化指针。
  • 现在,您可以解引用指针来获取或更新变量的值。

示例

在此示例中,我们演示了这三个步骤来解引用指针:

#include <stdio.h>

int main() {
  // Create a variable and pointer variable
  int x = 10;
  int *ptr;

  // Initialize the pointer by assigning
  // the address of the variable
  ptr = &x;

  // Dereference the pointer
  printf("Value of x = %d\n", *ptr);

  return 0;
}

输出

运行代码并检查其输出:

Value of x = 10

什么是解引用?

术语“解引用”是指访问指针引用的内存地址中存储的值。解引用运算符(也称为**间接运算符**)获取目标变量的值。

示例

在上例中,如果我们打印“*b”,您将获得“a”的值,即 10。类似地,打印“*y”将显示 10.5。

#include <stdio.h>

int main (){

   int a = 10;
   int *b = &a;
   float x = 10.5;
   float *y = &x;

   printf ("Address of 'a': %d Value of 'a': %d\n", b, *b);
   printf ("Address of 'x': %d Value of 'x': %f\n", y, *y);

   return 0;
}

输出

运行代码并检查其输出:

Address of 'a': 6422028 Value of 'a': 10
Address of 'x': 6422024 Value of 'x': 10.500000

通过解引用指针操作值

解引用运算符还有助于间接操作指针引用的变量的值。

示例

在此示例中,我们使用解引用指针更改“a”和“x”的值:

#include <stdio.h>

int main (){

   int a = 10;
   int *b = &a;
   float x = 10.5;
   float *y = &x;

   *b = 100;
   *y = 100.50;

   printf ("Address of 'a': %d Value of 'a': %d\n", b, *b);
   printf ("Address of 'x': %d Value of 'x': %f\n", y, *y);

   return 0;
}

输出

运行代码并检查其输出:

Address of 'a': 6422028 Value of 'a': 100
Address of 'x': 6422024 Value of 'x': 100.500000

解引用双指针

就像您将普通变量的地址存储在其指针中一样,您也可以拥有一个存储另一个指针地址的指针。拥有另一个指针地址的指针称为双指针或指向指针的指针。

让我们声明一个指向整数类型的指针,并将整数变量的地址存储在其中。

int a = 10;
int *b = &a;

解引用运算符通过指针获取值:

printf("a: %d \n Pointer to 'a' is 'b': %d \n Value at 'b': %d", a, b, *b);

整数变量的值、其地址以及解引用指针获得的值将被打印为:

a: 10 
Pointer to 'a' is 'b': 6422036 
Value at 'b': 10

现在让我们声明一个可以存储“b”地址的指针,“b”本身是指向整数类型的指针,写成“int *”。让我们假设编译器也为其分配地址 3000。因此,“c”是指向指向int的指针,应声明为“int **”。

int **c = &b;
printf("b: %d \n Pointer to 'b' is 'c': %d \n Value at 'b': %d\n", b, c, *c);

您可以获得b的值(它是a的地址)、c的值(它是b的地址)以及从c解引用的值(它是a的地址)。

b: 6422036 
Pointer to 'b' is 'c': 6422024 
Value at 'b': 6422036

由于这里“c”是双指针,声明中的第一个星号指向“b”,第二个星号依次指向“a”。我们可以使用双重引用指针从“c”获得“a”的值。

printf("Value of 'a' from 'c': %d", **c);

这应该显示a的值为10。

示例

尝试运行以下完整代码:

#include <stdio.h>

int main (){

   int a = 10;
   int *b = &a;
   printf("a: %d \n Address: %d \n Value at 'a': %d\n\n", a, b, *b);

   int **c = &b;
   printf("b: %d \n Pointer to 'b' is 'c': %d \n Value at 'b': %d\n", b, c, *c);
   printf("Value of 'a' from 'c': %d", **c);

   return 0;
}

输出

运行此代码时,将产生以下输出:

a: 10 
Address: 6422036 
Value at a: 10

b: 6422036 
Pointer to 'b' is 'c': 6422024 
Value at 'b': 6422036
Value of 'a' from 'c': 10

解引用结构体指针

关键字“struct”用于创建一个派生数据类型,该类型由一个或多个不同类型元素组成。像普通变量一样,您可以声明一个结构体指针并存储其地址。

struct book{
   char title[10];
   double price;
   int pages;
};

struct book b1 = {"Learn C", 650.50, 325};
struct book *ptr = &b1;

在C语言中,用箭头符号 (→) 表示的间接运算符用于获取结构体指针引用的结构体变量的元素的值。

示例

ptr -> title”返回title元素的值,与“b1.title”返回的值相同。“ptr -> price”等同于“b1.price”等。

#include <stdio.h>

struct book{
   char title[10];
   double price;
   int pages;
};

int main (){

   struct book b1 = {"Learn C", 650.50, 325};
   struct book *ptr = &b1;

   printf("With -> Operator: \n");
   printf("Title: %s \nPrice: %7.2lf \nNumber of Pages: %d\n\n", ptr->title, ptr->price, ptr->pages);

   printf("With . Operator:\n");
   printf("Title: %s \nPrice: %7.2lf \nNumber of Pages: %d\n", b1.title, b1.price, b1.pages);

   return 0;
}

输出

运行此代码时,将产生以下输出:

With -> Operator: 
Title: Learn C 
Price:  650.50 
Number of Pages: 325

With . Operator:
Title: Learn C 
Price:  650.50 
Number of Pages: 325

解引用嵌套结构体指针

尽管C语言使用箭头运算符 (→) 来访问结构体变量的元素,但任何内部结构体的元素都不能用它来访问。

只有外部结构体的元素才能用 → 运算符访问。对于后续的内部结构体元素,我们需要使用点(.)运算符。

示例

以下示例显示如何解引用嵌套结构体指针:

#include <stdio.h>
#include <string.h>

struct employee{
   char name[10];
   float salary;

   struct dob {
      int d, m, y;
   } d1;
};

int main(){

   struct employee e1 = {"Arjun", 45000, {12, 5, 1990}};
   struct employee *ptr = &e1;

   printf("Name: %s\n", ptr->name);
   printf("Salary: %f\n", ptr->salary);
   printf("Date of Birth: %d-%d-%d\n", ptr->d1.d, ptr->d1.m, ptr->d1.y);

   return 0;
}

输出

运行此代码时,将产生以下输出:

Name: Arjun
Salary: 45000.000000
Date of Birth: 12-5-1990
广告