讲到指针和数组,先给大家看一道例题:

题目:填空练习(指向指针的指针)
1.程序分析:     
2.程序源代码:
main()
{ char *s[]={"man","woman","girl","boy","sister"};
char **q;
int k;
for(k=0;k<5;k++)
{       ;/*这里填写什么语句*/
  printf("%s\n",*q);
}
}

指向指针的指针是什么呢?我们把一个指向指针变量的指针变量,成为多级指针变量,char **p;这种。

我们再看这道题 char *s[]={"man","woman","girl","boy","sister"};这时一个字符串数组,为什么存放字符串的数组要定义成指针数组呢?我们先来看看指针数组是什么

指针数组的实质还是数组,是存放指针的数组int *p[]  ,(int *)p[]是数组指针,指向数组地址的指针,这两个概念好像很绕是吧,很难分辨,在这里,博主将自己记忆的方法告诉大家,int *p[]  大家可以根据运算符优先级来记忆,[]的优先级 > *的优先级,所以这首先是个数组,然后才是指针,所以是指针数组;(int *)p[],()和[]优先级相等,但()是左结合,所以(int *)p[]先是指针,后是数组,所以这是个数组指针。

回到这一题,看这一句printf("%s\n",*q);我们知道%s后面跟的应该是一个地址,而*p是p中所指的数据,所以p地址中保存的还是一个地址,这就是多级指针,而我们用char **q;我们只知道q所指向的首地址,后面的数据如何分配,我们不得而知,所以这道题应该怎么做呢?

大家看看我们添加的内容:

[cpp] view plaincopy
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char *s[]={"man","woman","girl","boy","sister"};
  5. char **q;
  6. int k;
  7. for(k = 0;k < 5;k++)
  8. {
  9. q = &s[k];
  10. printf("%s\n",*q);
  11. }
  12. }

大家看输出结果:

[cpp] view plaincopy
  1. fs@ubuntu:~/qiang/shuzu$ gcc -o shuzu5 shuzu5.c
  2. fs@ubuntu:~/qiang/shuzu$ ./shuzu5
  3. man
  4. woman
  5. girl
  6. boy
  7. sister
  8. fs@ubuntu:~/qiang/shuzu$

为什么我们给的是p = &s[k]而不是*p = &s[k]呢?这里我们应该先理解二维数组

提到二维数组,我们又不得不提一维数组,一维数组 int a[n] 这里int是我们数据元素的数据类型,a是什么,a是数组名,代表数组的首地址,是数组第一个元素的地址,也就是可以说,a是int   a[n]的地址,a[0]也是;这里记住a是地址常量,是常量!常量!常量!重要的事说三遍!常量的特性是什么,不能对其赋值,大家记住这一点!"[]"是变址运算符,所以*(a+i)和a[i]无条件等价!n是数据的偏移量,是数据的偏移量,而不是字节的偏移量!这点和指针的*p++一样,是数据的偏移量,因为我们数组里放的是整型数据,也可能是字符型数据,所占字节大小是不一样的,所以是数据的偏移量!

我们回到二维数组  以int [3][4]为例,如下图

我们知道a[3]中a是地址,a[3][4]呢?a这里也是地址,存放的是什么数据呢?看图就知道,存放的是a[0]  a[1]  a[3],而a[0] a[1] a[2]是什么呢?其实是地址,地址里指向的分别是a[0][0]  a[1][0]   a[2][0]的数据,那我们是不是也可以将二维数据当成一个二级指针来看呢?大家思考一下。

博主思考了一下,说a里面存放的是a[0]  a[1] a[2]的地址不太确切 ,但a[0]  a[1] a[2]在这里确实是地址 ,上面说到二维数组是否可以看成二级指针,当然不能这样看,大家应该知道,a确实是代表地址,但它与指针有什么区别呢?大家看a[1] 的地址如何表示呢?是a+1,指针怎么表示呢?是p+1,好像是一样哦,但大家应该明白这里 a 是常量  ,p是变量,a + 1 中 a 的值没有发生变化,数组里面所有数据的地址都是由唯一的常量 a 来确定的! 而p + 1, p 的值已经发生了变化,因为 p 是变量!!!!!

我们再看看char *s[]={"man","woman","girl","boy","sister"},为什么要加*呢?因为存放的是字符串啊。字符串用地址来表示的啊!所以二级指针  二维数组  指针数组 这几个概念有时很容易把人搞晕,大家一定要注意分辨!

今天先写到这,后面会指针数组的深入内容!

Linux C编程---指针数组简析(二维数组、多级指针)相关推荐

  1. C++指针数组、数组指针、数组名及二维数组技巧汇总

    本文较为详细的分析了关于理解C++指针数组,数组指针,数组名,二维数组的一些技巧.是比较重要的概念,相信对于大家的C++程序设计有一定的帮助作用. 一.关于数组名 假设有数组: int a[3] = ...

  2. C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇

    序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首 ...

  3. java多维数组的指针_Java基础之二维数组

    二维数组概念 二维数组的概念 对于二维数组的理解,我们可以看成一位数组arrary1有作为另一个一维数组arrary2的元素存在.从底层机制来看没有多维数组概念 2二维数组的使用 二维数组的声明与初始 ...

  4. 遍历二维数组_Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  5. Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  6. oracle 一维数转二维数组,js将一维数组转化为二维数组

    遇到的问题: 后端返回的是一组一维数组,但是需要展示的格式是二维数组,常见的场景举例:后台返回10个长度的数组,需要分成3个一组展示在banner上. 例:[1,2,3,4,5,6,7,8,9,10] ...

  7. c语言定二维义数组,C语言二维数组超细讲解

    用一维数组处理二维表格,实际是可行的,但是会很复杂,特别是遇到二维表格的输入.处理和输出. 在你绞尽脑汁的时候,二维数组(一维数组的大哥)像电视剧里救美的英雄一样显现在你的面前,初识数组的朋友们还等什 ...

  8. 【C 语言】数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )

    文章目录 一.一维数组形参退化 二.二维数组形参退化 三.数组形参等价关系 一.一维数组形参退化 C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ; 将 int ar ...

  9. 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

    文章目录 一.验证二维数组内存是线性的 1.打印二维数组 2.以一维数组方式打印二维数组 3.打印二维数组值和地址 二.完整代码示例 一.验证二维数组内存是线性的 验证二维数组内存是线性的 : 验证方 ...

  10. oracle 声明二维数组,[zt]C++二维数组讲解、二维数组的声明和初始化

    定义: int *pia = new int[10]; //array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该 ...

最新文章

  1. 作为JavaScript开发人员,这些必备的VS Code插件你都用过吗
  2. DiscuzNT 商品交易插件设计之[线下交易流程]
  3. monkey测试===如何获取android app的Activity
  4. 洛谷 P4284 [SHOI2014]概率充电器 解题报告
  5. arguments.callee()事例 参数检验
  6. 一个人不孤单,想一个人才孤单
  7. 安装vim提示Depends: libpython3.5 (>= 3.5.0~b1) but it is not going to be installed的解决方法
  8. 模糊逻辑学习--模糊逻辑的基础
  9. hdoj 1863 畅通工程 最小生成树---prime算法
  10. 营收增速环比放缓 Okta高歌猛进的那股劲去哪了?
  11. 数字化是新物流的基础
  12. 腾讯云图,让数据说话
  13. 黑苹果 惠普笔记本电池补丁_笔记本的黑苹果之路
  14. 苹果或将采用高通屏下指纹方案,5GiPhone基带由三星、高通共同提供
  15. flink sql 知其所以然(八):flink sql tumble window 的奇妙解析之路
  16. 手动压缩Outlook PST和OST文件
  17. 数字图像处理--冈萨雷斯第4版--第一章 绪论
  18. (java毕业设计)基于ssm校园二手交易网站管理系统源码
  19. 21day学通python epub_Python Day21
  20. mysql索引实战_MySQL索引实战经验总结

热门文章

  1. SharePoint 2010-随机出现的页面性能问题
  2. JAVA的rotate怎么用,java如何利用rotate旋转图片_如何在Java中旋转图形
  3. PyTorch官方教程中文版:Pytorch之图像篇
  4. @Nullable 注解的用法
  5. Kubernetes 入门(2)基本组件
  6. leetcode 1006. 笨阶乘
  7. vue 响应式ui_如何在Vue.js中设置响应式UI搜索
  8. graphql tools_声明式GraphQL:编写更少的代码,并使用graphql-tools完成更多工作
  9. 傅里叶变换 直观_A / B测试的直观模拟
  10. python之路——迭代器与生成器