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所指向的首地址,后面的数据如何分配,我们不得而知,所以这道题应该怎么做呢?

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

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

大家看输出结果:

[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"},为什么要加*呢?因为存放的是字符串啊。字符串用地址来表示的啊!所以二级指针  二维数组  指针数组 这几个概念有时很容易把人搞晕,大家一定要注意分辨!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用@Autowired注解警告Field injection is not recommended

From: https://blog.csdn.net/zhangjingao/article/details/81094529 在使用spring框架中的依赖注入注解Autowired时&#xff0c;idea报了一个警告 大部分被警告的代码都是不严谨的地方&#xff0c;所以我深入了解了一下。 被警告的代码如下&#xff1a; Autowired UserDa…

简单的方式优化mysql

参考博客 自己笔记本上向mysql导入txt数据&#xff0c;有一个table导入了将近4个小时&#xff0c;而且多个table之间都是相互之间存在关系的&#xff0c;所以做联合查询的时候你会发现问题会十分的多&#xff0c;我之前联合查询两个表就死机了&#xff0c;所以优化mysql是迫在眉…

9颜色和背景

选择的类名最好描述其中包含的信息类型&#xff0c;而不是想要达到的视觉效果。 一般来说&#xff0c;前景是元素的文本&#xff0c;不过前景还包括元素周围的边框。color属性可以用来设置前景色。color有很多用法&#xff0c;其中最基本的是替换HTML3.2的BODY属性TEXT、LINK、…

linux C --深入理解字符串处理函数 strlen() strcpy() strcat() strcmp()

在linux C 编程中&#xff0c;我们经常遇到字符串的处理&#xff0c;最多的就是字符串的长度、拷贝字符串、比较字符串等&#xff1b;当然现在的&#xff23;库中为我们提供了很多字符串处理函数。熟练的运用这些函数&#xff0c;可以减少编程工作量&#xff0c;这里介绍几个常…

VSFTP的主动模式和被动模式

关于VSFTP的主动模式和被动模式一&#xff0c;首先我们看两个例子如下&#xff1a;其中192.168.10.7是服务端&#xff0c;172.16.11.11是客户端被动模式# netstat -an |grep 172.16.11.11tcp 0 0 192.168.10.7:52160 172.16.11.11:16091 TIME_WA…

SpringBoot项目利用maven自定义打包结构

From: https://blog.csdn.net/q15858187033/article/details/80742117 SpringBoot官方提供的demo中&#xff0c;pom.xml文件里引用了官方提供的打包插件 <build> <plugin> <groupId>org.springframework.boot</groupId> …

20169210《Linux内核原理与分析》第十二周作业

Return-to-libc 攻击实验 缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址&#xff0c;使得漏洞程序去执行存放在栈中 shellcode。为了阻止这种类型的攻击&#xff0c;一些操作系统使得系统管理员具有使栈不可执行的能力。这样的话&#xff0c;一旦程序…

判断android图片是否硬解码(方法)

2019独角兽企业重金招聘Python工程师标准>>> 在oncreate方面的setContentView(R.layout.main); 前面&#xff0c;添加如下代码&#xff1a; getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HAR…

如何解决Mybatis里mapper文件中关于不能用大于小于号

From: https://blog.csdn.net/qq_38659629/article/details/80408185 用<![CDATA[ ]]>标识 比如&#xff1a;<![CDATA[ where auctionEndTime < now()]]> 另外一种方法就是使用转义字符 < < > > & " < …

Linux C 编程技巧--利用有限状态机模型编程

我们知道&#xff0c;一般编写程序时都要画出流程图&#xff0c;按照流程图结构来编程&#xff0c;如果编写一个比较繁琐&#xff0c;容易思维混乱的程序时&#xff0c;我们可以利用有限状态机模型画出一个状态转移图&#xff0c;这样便可以利用画出的逻辑图来编写程序&#xf…

JVM的垃圾回收机制

发现一篇好文章,能够快速的帮助我们理清楚思路,以下内容转载 JVM的内部结构 先说下jvm运行时数据的划分&#xff0c;粗暴的分可以分为堆区(Heap)和栈区(Stack)&#xff0c;但jvm的分法实际上比这复杂得多&#xff0c;大概分为下面几块&#xff1a; 1、程序计数器(Program Conut…

centos配置ssh免密码登录后仍要输入密码的解决方法

From: https://blog.csdn.net/zwbill/article/details/80448939 前言 在搭建Linux集群服务的时候&#xff0c;主服务器需要启动从服务器的服务&#xff0c;如果通过手动启动&#xff0c;集群内服务器几台还好&#xff0c;要是像阿里1000台的云梯Hadoop集群的话&#xff0c;轨…

Linux c学习--从标准输入输出看流和缓冲区

学习标准输入输出&#xff0c;我们都会遇到一个概念&#xff0c;流和缓冲区&#xff0c;但到底什么是流&#xff0c;什么是缓冲区呢&#xff1f; 书《C Primer Plus》上说&#xff0c;C程序处理一个流而不是直接处理文件。后面的解释十分抽象&#xff1a;『流&#xff08;strea…

ubuntu vim8.0源码安装

安装篇 从https://github.com/vim/vim下载相应zip源码文件&#xff0c;利用unzip vim-master.zip 命令解压到当前用户目录&#xff0c;即~&#xff1b; 解压后进入vim的src目录&#xff0c;首先&#xff0c;即运行 sudo apt-get updata &#xff08;更新系统软件源&#xff09;…

Linux C学习---递归函数

最近学习到了递归&#xff0c;刚开始看&#xff0c;真是头大&#xff0c;函数里面嵌套其本身&#xff0c;到底是怎么个流程啊&#xff1f; 现在&#xff0c;咱们先了解下递归函数的数学原理&#xff1a; 高中的时候就出现很多递归函数&#xff0c;应该是在“级数”那里的习题中…

Java判断两个Date是不是同一天

From: https://blog.csdn.net/xingchenbingbuyu/article/details/82734695 Java判断两个Date是不是同一天 1. 利用Calendar Calendar cal1 Calendar.getInstance(); Calendar cal2 Calendar.getInstance(); cal1.setTime(date1); cal2.setTime(date2); boolean sameDay ca…

js二级下拉被flash档住的解决办法

在<object></object>及以内的代码加入到<script>标签对内<script language"javascript" type"text/javascript"> <param name"wmode" value"transparent" />//背景透明 </script> 转载于:https:/…

iOS:以前笔记,未整理版。太多了,先放着吧。。。。。。。

1、**************************************************************** 单例共享 **************************************************************** 单例 共享信息 .m static OneT *newone nil; (instancetype)shalldata { if (newone nil) { newone [[OneT alloc]init]…

C语言经典编程题--哥德巴赫猜想 、完数 、猜数字等

一、 验证歌德巴赫猜想&#xff1a;任意一个不小于6的偶数都可以表示成两个素数的和。从键盘任意给一个符合条件的数&#xff0c;输出相应的两个素数。 素数&#xff1a;指在一个大于1的自然数中&#xff0c;除了1和此整数自身外&#xff0c;没法被其他自然数整除的数 代码如下…

Calendar的DAY_OF_MONTH, DAY_OF_YEAR, DATE的区别

From: https://blog.csdn.net/weixin_34233679/article/details/87286628 cal1.add(Calendar.DAY_OF_MONTH,1); cal1.add(Calendar.DAY_OF_YEAR,1); cal1.add(Calendar.DATE,1); 就单纯的add操作结果都一样&#xff0c;因为都是将日期1 就没有区别说是在月的日期中加1还是…