Linux C编程---指针数组简析(二维数组、多级指针)
讲到指针和数组,先给大家看一道例题:
题目:填空练习(指向指针的指针)
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所指向的首地址,后面的数据如何分配,我们不得而知,所以这道题应该怎么做呢?
大家看看我们添加的内容:
- #include <stdio.h>
- int main()
- {
- char *s[]={"man","woman","girl","boy","sister"};
- char **q;
- int k;
- for(k = 0;k < 5;k++)
- {
- q = &s[k];
- printf("%s\n",*q);
- }
- }
大家看输出结果:
- fs@ubuntu:~/qiang/shuzu$ gcc -o shuzu5 shuzu5.c
- fs@ubuntu:~/qiang/shuzu$ ./shuzu5
- man
- woman
- girl
- boy
- sister
- 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编程---指针数组简析(二维数组、多级指针)相关推荐
- C++指针数组、数组指针、数组名及二维数组技巧汇总
本文较为详细的分析了关于理解C++指针数组,数组指针,数组名,二维数组的一些技巧.是比较重要的概念,相信对于大家的C++程序设计有一定的帮助作用. 一.关于数组名 假设有数组: int a[3] = ...
- C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇
序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首 ...
- java多维数组的指针_Java基础之二维数组
二维数组概念 二维数组的概念 对于二维数组的理解,我们可以看成一位数组arrary1有作为另一个一维数组arrary2的元素存在.从底层机制来看没有多维数组概念 2二维数组的使用 二维数组的声明与初始 ...
- 遍历二维数组_Java编程基础阶段笔记 day06 二维数组
二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...
- Java编程基础阶段笔记 day06 二维数组
二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...
- oracle 一维数转二维数组,js将一维数组转化为二维数组
遇到的问题: 后端返回的是一组一维数组,但是需要展示的格式是二维数组,常见的场景举例:后台返回10个长度的数组,需要分成3个一组展示在banner上. 例:[1,2,3,4,5,6,7,8,9,10] ...
- c语言定二维义数组,C语言二维数组超细讲解
用一维数组处理二维表格,实际是可行的,但是会很复杂,特别是遇到二维表格的输入.处理和输出. 在你绞尽脑汁的时候,二维数组(一维数组的大哥)像电视剧里救美的英雄一样显现在你的面前,初识数组的朋友们还等什 ...
- 【C 语言】数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )
文章目录 一.一维数组形参退化 二.二维数组形参退化 三.数组形参等价关系 一.一维数组形参退化 C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ; 将 int ar ...
- 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )
文章目录 一.验证二维数组内存是线性的 1.打印二维数组 2.以一维数组方式打印二维数组 3.打印二维数组值和地址 二.完整代码示例 一.验证二维数组内存是线性的 验证二维数组内存是线性的 : 验证方 ...
- oracle 声明二维数组,[zt]C++二维数组讲解、二维数组的声明和初始化
定义: int *pia = new int[10]; //array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该 ...
最新文章
- 作为JavaScript开发人员,这些必备的VS Code插件你都用过吗
- DiscuzNT 商品交易插件设计之[线下交易流程]
- monkey测试===如何获取android app的Activity
- 洛谷 P4284 [SHOI2014]概率充电器 解题报告
- arguments.callee()事例 参数检验
- 一个人不孤单,想一个人才孤单
- 安装vim提示Depends: libpython3.5 (>= 3.5.0~b1) but it is not going to be installed的解决方法
- 模糊逻辑学习--模糊逻辑的基础
- hdoj 1863 畅通工程 最小生成树---prime算法
- 营收增速环比放缓 Okta高歌猛进的那股劲去哪了?
- 数字化是新物流的基础
- 腾讯云图,让数据说话
- 黑苹果 惠普笔记本电池补丁_笔记本的黑苹果之路
- 苹果或将采用高通屏下指纹方案,5GiPhone基带由三星、高通共同提供
- flink sql 知其所以然(八):flink sql tumble window 的奇妙解析之路
- 手动压缩Outlook PST和OST文件
- 数字图像处理--冈萨雷斯第4版--第一章 绪论
- (java毕业设计)基于ssm校园二手交易网站管理系统源码
- 21day学通python epub_Python Day21
- mysql索引实战_MySQL索引实战经验总结
热门文章
- SharePoint 2010-随机出现的页面性能问题
- JAVA的rotate怎么用,java如何利用rotate旋转图片_如何在Java中旋转图形
- PyTorch官方教程中文版:Pytorch之图像篇
- @Nullable 注解的用法
- Kubernetes 入门(2)基本组件
- leetcode 1006. 笨阶乘
- vue 响应式ui_如何在Vue.js中设置响应式UI搜索
- graphql tools_声明式GraphQL:编写更少的代码,并使用graphql-tools完成更多工作
- 傅里叶变换 直观_A / B测试的直观模拟
- python之路——迭代器与生成器