全国咨询/投诉热线:400-618-9090

首页技术文章正文

c语言二级指针的理解【黑马程序员】

更新时间:2020-09-18 来源:传智播客 浏览量:


之前几篇文章介绍的指针都是一级指针,其实指针还可以指向一个指针,即指针中存储的是另一个指针变量的地址,这样的指针称为二级指针,使用二级指针可以间接修改一级指针的指向,也可以修改一级指针指向的变量的值。

定义二级指针的格式如下:

变量类型 **变量名;

上述语法格式中,变量类型就是该指针变量指向的指针变量所指变量的数据类型,两个符号“*”,表明这个变量是个二级指针变量。

通过二级指针可以直接修改一级指针指向的变量的值,也可以间接修改一级指针的指向。下面以案例的形式介绍二级指针这两方面的作用。

1、通过二级指针间接修改变量的值

下面通过一个案例来演示如何使用二级指针直接修改变量的值,如例1所示。

例1 addr.c

#include <stdio.h>
int main()
{
  int a = 1;         //整型变量
  int* p = &a;        //一级指针p,指向整型变量a
  int** q = &p;       //二级指针q,指向一级指针p
  printf("变量a的地址:%p\n",&a);
  printf("一级指针p的地址:%p\n", p);
  printf("二级指针q存储的值:%p\n", *q);
  printf("二级指针q的地址:%p\n", q);
  **q = 2;          //二级指针间接改变,
  printf("变量a的值%d\n", a);
  return 0;
}

例1运行结果如图1所示。

1600418910350_二级指针.jpg

在例1中,指针q是一个二级指针,其中存储一级指针p的地址,而p中存储整型变量a的地址,第11行代码通过间接访问运算符“”间接修改二级指针变量q中存储的指针所指向的值,从而修改变量a的值。由图5-10可知,变量a的值被修改成功。它们之间的逻辑关系如图2所示。

1600418924586_指向指针变量.jpg

从图2运行结果可以清晰的发现变量a的地址、一级指针p的地址和二级指针存储的地址值是一样的。

2、通过二级指针改变一级指针的指向

二级指针除了直接改变变量的值以外,也可以改变一级指针的指向,下面通过一个案例来演示如何通过二级指针改变一级指针的指向,如例2所示。

例2 poniter.c

#include <stdio.h>
int main()
{
  int a = 1;         //整型变量
  int* p = &a;        //一级指针p,指向整型变量a
  int** q = &p;       //二级指针q,指向一级指针p
  int b = 3;
  printf("变量a的地址:%p\n", &a);
  printf("一级指针p的地址:%p\n", p);
  printf("二级指针q存储的值:%p\n", *q);
  printf("二级指针q的地址:%p\n", q);
  printf("================================\n");
  *q = &b;          //修改一级指针的指向
  printf("变量a的地址:%p\n", &a);
  printf("变量b的地址:%p\n", &b);
  printf("一级指针p的地址:%p\n", p);
  printf("二级指针q存储的值:%p\n", *q);
  printf("二级指针q的地址:%p\n", q);
  printf("指针p指向地址存储的值%d\n", *p);
  return 0;
}

例2运行结果如图2所示。


1600418842534_二级指针运行结果.jpg

在例2中,第4~5行代码定义int类型变量a,取其地址赋值给一级指针变量p;第6行代码取一级指针变量p的地址赋值给二级指针q,则二级指针q的值是一级指针变量p的内存地址;第8~11行代码分别输出变量a的地址、一级指针p的地址、二级指针q存储的值以及二级指针q的地址。由图2可知,二级指针q存储的值与一级指针p的地址以及变量a的地址是相同的。

在例2中,通过间接访问运算符“”,修改二级指针的指向,即第13行代码使二级指针变量q中保存的一级指针变量p指向变量b。它们之间的逻辑关系如图3所示。

1600418882679_二级指针改变指向关系.jpg

第14~19行代码分别输出变量a的地址、变量b的地址、一级指针变量p的地址、二级指针q存储的值及其地址。从图3的输出结果可以清晰的看到一级指针变量p、二级指针变量q存储的值和变量b的地址是相同的。


猜你喜欢:

C语言指针变量类型和大小

c语言指针详解:什么是指针?

C语言取地址运算

C语言指针间接访问

C语言培训课程


javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

http://www.itcast.cn/subject/uizly/index.shtml?seozxuids

pythonAI

在线咨询 我要报名