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,一经查实,立即删除!

相关文章

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…

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

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

linux远程登录三种方式telnet,ssh,vnc

linux远程连接三种方式telnet&#xff0c;ssh&#xff0c;vnctelnet和ssh服务只能实现基于字符界面的远程控制&#xff0c;如果要基于图形界面进行远程控制&#xff0c;可以借助免费的VNC来完成。一、telnet连接1.首先进入终端&#xff0c;查看是否安装了telnet服务。linux默认…

大数据之Yarn——Capacity调度器概念以及配置

试想一下&#xff0c;你现在所在的公司有一个hadoop的集群。但是A项目组经常做一些定时的BI报表&#xff0c;B项目组则经常使用一些软件做一些临时需求。那么他们肯定会遇到同时提交任务的场景&#xff0c;这个时候到底如何分配资源满足这两个任务呢&#xff1f;是先执行A的任务…

C/C++经典面试题

面试题1&#xff1a;变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义&#xff0c;不分配地址的称为声明。一个变量可以在多个地方声明&#xff0c;但只能在一个地方定义。加入extern修饰的是变量的声明&#xff0c;说明此变量将在文件以外或在文件后面部分定义…

Java跳出多重循环

From: https://www.cnblogs.com/fastfn/p/9777067.html 场景&#xff1a;很多的时候需要做到跳出多重循环&#xff0c;而在Java中虽然后goto关键字&#xff0c;但是是保留字&#xff0c;并没有启用。而在处理分支结构的if...else,switch...case,好像都达不到想要的效果。 作为…

java基础集合简介Map(三)下

From: https://www.cnblogs.com/douyu2580860/p/8358768.html --Map接口简介 今天来看一看map集合&#xff0c;map映射接口&#xff0c;用于存放键值对&#xff0c;<key,value>&#xff0c;通过key来查找value,顾名思义key不能为空&#xff0c;唯一且不重复&#xff0c;不…

从getmemery()函数看内存管理、函数传参等一系列问题

在C 面试题目中&#xff0c;会经常出现getmemery()函数的改错题&#xff0c;比如下面这道题&#xff0c; 例一&#xff1a;代码如下&#xff1a; [cpp] view plaincopy #include <stdio.h> char *getmemery() { char p[] "hello world!"; …

Java中array、List、Set互相转换

From: https://www.cnblogs.com/yysbolg/p/9977365.html 数组转List String[] staffs new String[]{"A", "B", "C"}; List staffsList Arrays.asList(staffs);//注意: Arrays.asList() 返回一个受指定数组决定的固定大小的列表。所以不能做 a…

Apache Shiro 使用手册(三)Shiro 授权

授权即访问控制&#xff0c;它将判断用户在应用程序中对资源是否拥有相应的访问权限。 如&#xff0c;判断一个用户有查看页面的权限&#xff0c;编辑数据的权限&#xff0c;拥有某一按钮的权限&#xff0c;以及是否拥有打印的权限等等。 一、授权的三要素授权有着三个核心元素…

UVa 10026 - Shoemaker's Problem

题目大意&#xff1a;鞋匠有n个任务&#xff0c;第i个任务要花费ti天&#xff0c;同时第i个任务每耽误一天要有fi的罚金。求完成所有任务的最小罚金。 虽然知道是贪心&#xff0c;可是并不确定如何作贪心选择&#xff0c;只好“取经”了...假如有两个任务i和j&#xff0c;先做i…

在VS2012中实现Ext JS的智能提示太简单了

Visual Studio 2012太强大了&#xff0c;居然能自己会去提取Ext JS的类的属性和方法&#xff0c;从而实现只能提示。下面就来介绍一下实现这个功能。在Visual Studio 2012中随便创建一个Web项目&#xff0c;我创建了一个空的Web项目&#xff0c;目录结构如下图所示&#xff1a;…

mybatis 查询之神坑

先看一个示例&#xff1a; 数据表数据&#xff1a; mybatis类和查询语句&#xff1a; 1. 当UserInfoMap中所有字段(包含association)都为NULL的话&#xff0c;getUserInfo的返回结果是个null&#xff0c;即使查询的记录存在&#xff01;运行结果如下&#xff1a; 2019-06-26 …

微软万圣节文件

为什么80%的码农都做不了架构师&#xff1f;>>> http://www.aka.org.cn/Docs/halloween/halloweenDoc.html 微软万圣节文件 圣节文件在微软以外被用作称呼一系列来源可靠的备忘录&#xff0c;内容是微软总部用来对付开源软件&#xff08;特别是Linux&#xff09;的…

linux C 学习 简单字符串逆序输出

看了下网上的字符串逆序输出&#xff0c;都相对复杂&#xff0c;下面给一个简单的字符串逆序输出小程序实现: [cpp] view plaincopy #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i; int n; …

【干货分享】流程DEMO-补打卡

流程名&#xff1a; 补打卡申请 业务描述&#xff1a; 当员工在该出勤的工作日出勤但漏打卡时&#xff0c;于一周内填写补打卡申请。 流程相关文件&#xff1a; 流程包.xml 流程说明&#xff1a; 直接导入流程包文件&#xff0c;即可使用本流程 表单&#xff1a; 流程&#xf…

2019年最流行的10个前端框架

From: http://blog.sina.com.cn/s/blog_18337e9c40102yt1x.html &#xfeff;2019年最流行的10个前端框架 从去年下半年开始&#xff0c;互联网行业慢慢进入寒冬&#xff0c;一些设计师也不得不重新找工作。关于求职这个事情&#xff0c;UI黑客之前写过一篇文章《面试了50多位…

Linux C 中断言assert()使用简介

assert()是一个调试程序时经常使用的宏&#xff0c;在程序运行时它计算括号内的表达式&#xff0c;如果表达式为FALSE (0), 程序将报告错误&#xff0c;并终止执行。如果表达式不为0&#xff0c;则继续执行后面的语句&#xff0c;它的作用是终止程序以免导致严重后果&#xff0…