前边已经讲过数组指针,强调的是指针,意思就是该指针指向的是数组(数组里边的元素一般为普通数据)。

指针数组,强调的是数组,意思就是该数组里边的每个元素都是指针类型。即如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组。

形式如下:

dataType *arrayName[length];
//[ ]的优先级高于*,该定义形式应该理解为:
dataType *(arrayName[length]);//先强调数组,再说数组的元素是指针

括号里面说明arrayName是一个数组,包含了length个元素,括号外面说明每个元素的类型为dataType *

除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的,下面是一个简单的例子:

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;int main() {int a = 13, b = 32, c = 0;int *arr[3] = { &a, &b, &c };//   //定义一个指针数组  //也可以不指定长度,直接写作int *arr[]                            int **parr = arr; //定义一个指向指针数组的指针//它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);//输出数据cout << "数组元素的地址:" << arr[0] << " , " << arr[1] << " , " << arr[2] << endl;//地址cout<<"&abc: "<< &a<< " , " << &b << " , " << &c << endl;//地址//parr是一个指针,parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,第一个元素是地址,所以*parr是第一个元素的值也就是地址,**parr是取的第一个元素即地址里边的数据也就是a的值13cout << "*parr= " << *parr << endl;//*parr表示数组首地址 即**parr=&arrcout << "**parr= " << **parr << endl;//**parr=13printf("%d, %d, %d\n", **(parr + 0), **(parr + 1), **(parr + 2));return 0;
}

结果如下:

arr 是一个指针数组,它包含了 3 个元素,每个元素都是一个指针,在定义 arr 的同时,我们使用变量 a、b、c 的地址对它进行了初始化,这和普通数组是多么地类似。

parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。arr 第 0 个元素的类型为 int *,所以在定义 parr 时要加两个 *。

第一个 printf() 语句中,arr[i] 表示获取第 i 个元素的值,该元素是一个指针,还需要在前面增加一个 * 才能取得它指向的数据,也即 *arr[i] 的形式。

第二个 printf() 语句中,parr+i 表示第 i 个元素的地址,*(parr+i) 表示获取第 i 个元素的值(该元素是一个指针),**(parr+i) 表示获取第 i 个元素指向的数据。

指针数组还可以和字符串数组结合使用,请看下面的例子:

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;int main()
{char *str[3] = {"a.bc.com","C中国","L China"};//str是字符数组,str[3]里边的每一个元素都是char *类型都是指针类型printf("%s\n%s\n%s\n", str[0], str[1], str[2]);//str[0]是char*类型,相当于 char *str0 = "c.biancheng.net";cout << *str[0] << endl;//数组里边第一个元素里边的第一个元素cout << *str[1] << endl; //数组里边第二个元素里边的第一个元素cout << *str[2] << endl; //数组里边第三个元素里边的第一个元素cout << str[0] << endl;//数组里边的第一个元素return 0;
}

结果如下:

需要注意的是,字符数组 str 中存放的是字符串的首地址,不是字符串本身,字符串本身位于其他的内存区域,和字符数组是分开的。
也只有当指针数组中每个元素的类型都是char *时,才能像上面那样给指针数组赋值,其他类型不行。

为了便于理解,可以将上面的字符串数组改成下面的形式,它们都是等价的。

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;int main() {char *str0 = "a.bc.com";char *str1 = "C中国";char *str2 = "L China";char *str[3] = { str0, str1, str2 };printf("%s\n%s\n%s\n", str[0], str[1], str[2]);return 0;
}

结果如下:

C指针9:指针数组(即数组中的每个元素都是指针)相关推荐

  1. 【Dart 教程系列第 17 篇】Dart 之 every 判断数组中是否每个元素都满足指定的条件

    这是[Dart 教程系列第 17 篇],如果觉得有用的话,欢迎关注专栏. Dart 判断数组中是否每个元素都满足指定的条件用 every() 方法,源代码定义如下 bool every(bool te ...

  2. Java黑皮书课后题第7章:7.26(完全相同的数组)如果两个数组list1和list2的对应元素都相等,认为完全相同。编写一个测试程序,提示用户输入两个整数列表,然后显示这两个列表是否完全相同

    7.26(完全相同的数组)如果两个数组list1和list2的对应元素都相等,认为完全相同.编写一个测试程序,提示用户输入两个整数列表,然后显示这两个列表是否完全相同 题目 题目描述与运行示例 破题 ...

  3. 数组A[10][15]的每个元素都是占4个字节的数据,将其按列优先次序存储

    这个还是要记一下的 数组A[10][15]的每个元素都是占4个字节的数据,将其按列优先次序存储,若A[0][0]存储地址在起始地址为1000的内存单元中,则元素A[6][9]的地址是?答案1384 l ...

  4. php多维数组添加元素,PHP中如何将元素添加到多维数组

    多维数组是指含有数组元素的数组,那么如何将元素添加到多维数组中呢?本篇文章就来给大家介绍一下php中将元素添加到多维数组的方法. 多维数组写法如下: $multi_dimensional_array ...

  5. Python中判断所有元素都为True——all()函数

    [快速理解] 对于all([a,b,c]):只有a.b.c都是True,则结果为True 选择题 以下语句的运行结果是 print(all((1,0,None)),all([None,0]),all( ...

  6. java快速找出数组或集合中重复的元素

    1.测试方法如下 public class TestArrayRepeat {public static void main(String[] args) {String [] idArr= {&qu ...

  7. Trick(十四)—— 判断是否序列中所有的元素都相同

    法一:转换为集合后的长度 转换为集合,实现去重 len(set(l)) == 1 法二:使用 count() 成员函数 count() 统计某元素出现的次数 l.count(l[0]) == len( ...

  8. 指针数组与数组指针的区别

    指针数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组. 一维指针数组的定义形式为:"类型名 *数组标识符[数组长度]". 例如,一个一维指针数组的定义:int *p ...

  9. [C] 数组指针、指针数组及数组传参

    指针 字符指针 数组指针 指针数组 一维数组传参 1. 整型数组 2. 指针数组 二维数组传参 一级指针传参 二级指针传参 小引 在指针的学习阶段,有不少同学都十分畏惧这个物什,甚至"谈指针 ...

最新文章

  1. node编写定时任务,for循环只执行一遍的解决办法
  2. 论文推荐 | 目标检测中不平衡问题算法综述
  3. Python要了解哪些编程基础 如何学Python比较好
  4. 如何用技术搞好英俄翻译?
  5. 《LeetCode力扣练习》第338题 比特位计数 Java
  6. Unity3D对手机屏幕触摸的控制脚本
  7. java中的几种泛型类——HashSet、HashMap、TreeSet、TreeMap,遍历map,排序,HashTable比较
  8. Ajax——php基础知识(二)
  9. Unique Binary Search Trees
  10. Java 源码--Arrays
  11. mysql数据库的存储过程不用学吗,MySql数据库之存储过程学习_MySQL
  12. 微信小程序和vue双向绑定哪里不一样_浅析Vue 和微信小程序的区别、比较
  13. iPhone 12 Pro火爆程度超预期 苹果紧急向关键组件厂商加单
  14. 用c++实现一个插入,删除和随机访问都是O(1)的容器(剑指||30)
  15. JUC并发编程超详细详解篇
  16. Spring WebAppInitializer without web.xml
  17. reids实现分布式锁两种方式,单机,集群
  18. 设置ubuntu Android sdk JDK环境变量
  19. 网络模块封装-axio
  20. C51单片机控制蜂鸣器

热门文章

  1. 2021年大数据Spark(二十二):内核原理
  2. Mysql锁专题:InnoDB锁概述
  3. mysql 5.7笔记_关于MySql 5.7.29免安装版本的一个笔记
  4. python join 的使用
  5. Android 串口通讯 获取卡号
  6. Object.defineProperty()
  7. 微信小程序开发工具的基本应用
  8. centos6.5离线安装gcc gcc++ rpm
  9. Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]
  10. markdown 基本语法