IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言:关于二级指针之指向指针数组的指针的理解和操作 -> 正文阅读

[C++知识库]C语言:关于二级指针之指向指针数组的指针的理解和操作

一、二级指针的概念

二级指针就是指向指针的指针,二级指针中存储的是指针的地址。指向存储指针空间的首地址。

二、二级指针之指向指针数组的定义

1.首先讲一下什么是指针数组和数组指针:

(1)指针数组意思是存储指针的数组,指针数组可以存储多个指针。
(2)数组指针的意思是数组的指针,数组指针指向的是数组,包括一维数组、二维数组、n维数组,数组指针只有一个。

2.指向指针数组的指针

它也是唯一确定的,因为存储指针数组的空间的起始地址是确定的,指向其的指针也是唯一确定的,这里要注意二级指针的类型应与指针数组的类型相同,移动二级指针的步长取决于数据类型,假如是int类型的指针数组,那么其二级指针移动一个步长的大小为4个字节,假如是char类型的数组其二级指针则移动一个步长大小为1个字节。

#include<stdio.h>
void main()
{    /*首先定义一个长度为3的字符型指针数组,这里的长度
      就是指针数组里面指针的个数,注意[]的优先级高于*,*p不用加括号
     加括号就变成了指向列数为3的二维数组的指针,那就不是数组了*/
	char *p[3]={"hello","fishinger","Good"};
	char **q=p;//定义一个二级指针q并将指针数组的地址赋值给q
}

上述代码定义了一个长度为3的指针数组,移动其二级指针,假如移动一个步长,令q=q+1,此时二级指针指向的是存储指针数组第二个指针的空间的首地址。

三、使用二级指针访问任意数组元素,并输出字符

要访问任意的数组元素,需要得到指向任意字符的的指针。
例如第二个字符串"fishinger"中的第七个字符’g’:
1.首先要移动二级指针q一个步长,即q+1,等价于&p[1],使其指向指针数组中第二个指针的起始地址,即指针p[1]的起始地址。
2.对q+1使用取值字符’ * ’ 得到指针数组中第二个指针,即 *(q+1),等价于p[1]
3.对指针 * (q+1)移动6个步长,即 * (q+1)+6,等价于 * (p[1]+6),其指向第七个字符’g’的起始地址(首地址),加6是因为指针指向的是内存中的首地址,数组的内存是连续的,所以移动6个步长就可以指向第7个符’g’的起始地址。
4.对指针 * (q+1)+6使用取值运算符*得到字符’g’。
可结合下图理解:

图解二级指针
代码:

#include<stdio.h>
void main()
{   char *p[3]={"hello","fishinger","Good"};
	char **q=p;
  /*访问数组元素,这里以访问第二个字符串中第7个字符g为例
	移动二级指针q,首先的是将二级指针移动一个char大小的步长使其指向指针数
	组中第二个指针的首地址,然后用取值符号*得到指向第二个字符串首地址的指
	 针*(q+1),然后移动该指针6个char大小的步长得到指向字符g的指针*(q+1)+6, 
	 然后对其用取值符号,得到字符g.*/
	printf("%c\n",*(*(q+1)+6));
}

结果:

g

四、使用二级指针输出任意字符串

1.输出任意指针数组中各指针指向的内存中存储的字符串

前面的字符型指针数组中的指针有3个,其指向的内存中存储的字符串也有三个,分别是"hello",“fishinger”,“Good”,现在先输出其中任意一个字符串,我们只需要移动二级指针q即可,以输出字符串"fishinger"为例:

#include<stdio.h>
void main()
{    
	char *p[3]={"hello","fishinger","Good"};
	char **q=p;
	printf("%s",*(q+1));//要注意+号的优先级比*低,记得加括号。
}

结果:

fishinger

上述中的1换成2则输出第三个字符串"Good",不加任和数,即*q,则输出第一个字符串"hello"。

2.输出指针数组中各指针指向的内存中存储的全部字符串

有了输出单个字符串的经验,输出全部字符串就很简单了,只需使用循环就可以输出所有字符串,代码如下:

#include<stdio.h>
void main()
{
	char *p[3]={"hello","fishinger","Good"};
	char **q=p;
	for(int i=0;i<3;i++)
	{
		printf("%s ",*(q+i));//这里每输出一个字符的之后加上一个空格,输出结果更美观。
	}
}

结果:

hello fishinger Good

写在最后:
文章可能有不足之处,欢迎大家一起来探讨交流,加深理解。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:35:34  更:2022-10-31 11:38:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:35:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码