说起c语言的指针,估计对c语言只是一知半解的同志们可能都会很头疼,尤其它跟数组又无耻的联系到一起的时候,就更加淫荡了!!!

怎么说呢,就是有一点规定:(或准则)

数组名可以看成是指向数组头元素的指针,对,只是能看成。但,数组名,不是指针(不能相互赋值)。不过,可以当指针用。但是,指针不可以当数组名用。

在c语言的始祖书籍《K&R》中,有这么一段声明:只有在作为函数形参的时候

int a[];

int *a;   具有相同的意义。 这个必须要理解。

例如: char str[]="abc";

str[0]='d'; -----可写

char *str="abc";

str[0]='d';-----一般会报错

然后,重点理解下二维数组与指针的关系(注:没有二维数组这么个东西,标准叫法是数组的数组)

代码:

#include<stdio.h>

int main()

{

 char* color[]={   "red",   "green",   "blue"  };  

]={   "red",   "green",   "blue"  };

 printf("%p\n",color);

 printf();  

printf();

 printf("%s\n",*color);

 printf(]);

 printf(][]);

 printf());

 printf(]);

 printf(]);

 printf())[]);//jiu zhe me xiao zhang

 printf()+));

 printf())[]);

 printf("%c\n",**color);

 printf("数组的数组\n");  printf("%s\n",*color);

 printf());

 printf(]);

 printf(][]);

 printf("字符串\n");  char* str="abc";

 printf("%c\n",*str);

 printf();

 printf());

 printf(],]));  

;

}

逐个分析:

color是指向第一个数组的头一个元素的指针,也是数组名,第一个数组实际是color[3][5].

那么 *color   就是red 了,color指向red,加个*号,表示解引用,打印真实对象值;

color[0]  很明显,就是第一个元素,也是red;

color[0][0]  第一个元素red的第一个元素 ,即r;

**color  与上一个等价,*color是"red",而字符串又是char的数组,所以,就相当于*color又是char[]数组的指针了,再加一个*,解引用,就成r了;

char[]={'r','e','d','\0'}

同理   *(*color+1) ,就是第二个字母e了;

因为  *color就是"red"嘛,*color就相当于char[]的数组名了呗,那么(*color)[1],也就表示该char[]数组的第二个字母了,即e;

注意,我说的char[]数组就是char[]={'r','e','d','\0'},通篇公用哈~

再来区别一下:

(*color)[1]   输出e,即red里面的e

*color[1]     输出g,即green的g;

因为  *color  整体代表一个数组名

但由于这种表达式是从右向左结合的,所以如果没有(),则首先会生成color[1],即字符串"green",而字符串"green"也可以看成是char[]数组,所以color[1],这时候还有一个角色就是char[]={'g','r','e','e','n','\0'}的数组名了,所以,再加个*,自然输出的就是g了。

同理:

(*(color+1))[4]

*(*(color+1)+4)等价。

再看看colors数组,它的声明中没有出现*号,那么它该怎么与*联系呢?当然,只有一条:数组名可以看成是指向数组第一个元素的指针。

比如:  colors[0]

*colors  等价,colors可以看成是指向"red"的指针,加*号解引用。

比如:  colors[1][0]

**(colors+1) 等价,其中,*(colors+1)是"green"  ,再加*号,表示"green"的第一个元素,即g。

程序运行的截图:

欢迎讨论~~

c语言中双维数组与指针的那点事儿的更多相关文章

  1. c语言中多维数组和指针的关系

    如图: 执行结果: 说明:由执行结果可知,三个输出的结果相等(可能在不同的平台执行结果不相同,但三个的结果是相等的),数组multi的地址与数组multi[0]的地址相同,都等于存储的第一个整数的地址 ...

  2. C语言教学--二维数组和指针的理解

    对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...

  3. C语言--指向多维数组的指针和指针数组

    #include <stdio.h> //void show(char *p[]); ]); int main(){ ][]={","abc","x ...

  4. C语言之二维数组与指针

    二维数组: ][]; 二维数组实质上也就是一维数组,a[2][3]可看做一个2个元素的一维数组,这2个元素又是另一个数组,在内存中,它的排布如下: #include "stdio.h&quo ...

  5. 关于c语言二维数组与指针的个人理解及处理办法。

    相信大家在学习C语言时,对一维数组和指针的理解应该是自信的,但是,我在学习过程中,看到网上一些博文,发现即便是参加工作的一些专业编程人员,突然碰到二维数组和指针的问题时,也可能会遇到难以处理的诡异问题 ...

  6. C语言多维数组的指针传递

    在C语言中为了节省空间,提高运行速度经常使用指针来完成数组的传递. 对于一维数组而言可以直接传递首地址 而对于二维数组必须在传递时声明是二维数组的指针,并且调用时也要经过一些运算 首先是定义形参: 函 ...

  7. C语言 二维数组(指针)动态分配和释放(转)

    C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...

  8. 二维数组和指针(C语言)

    二维数组和指针 二维数组和指针1.二维数组和数组元素的地址若有以下定义:int *p, a[3][4]; 1)二维数组a由若干个一维数组组成在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的 ...

  9. c语言编程-----指向二维数组的指针

    c中如何返回一个指向二维数组的指针 #include <stdio.h> #include <stdlib.h> #define COUNT 3 typedef int (*M ...

随机推荐

  1. HDU 5818 Joint Stacks(左偏树)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5818 [题目大意] 给出两个栈A B(初始时为空),有三种操作: push.pop.merge. ...

  2. POJ 3723 Conscription(并查集建模)

    [题目链接] http://poj.org/problem?id=3723 [题目大意] 招募名单上有n个男生和m个女生,招募价格均为10000, 但是某些男女之间存在好感,则招募的时候, 可以降低与 ...

  3. STC15?MSP430?ARM?DSP?

    自从大学毕业以来,发现属于自己的时间越来越少,每天忙于工作,导致在大学学到的东西都好生疏,特别是大一刚开始学的模电,单片机等,现在才慢慢的抓起来,然后在这个多核处理器流行的时代,单片机貌似快过时了,但 ...

  4. PID教程

    PID教程 介绍 本教程将向您展示了比例每一个比例项 (P)的特点,积分项(I)和微分项 (D) 控制,以及怎样使用它们来获得所需的响应.在本教程中,我们会考虑下面单位反馈系统: Plant[被控对象 ...

  5. python property装饰器

    直接上代码: #!/usr/bin/python #encoding=utf-8 """ @property 可以将python定义的函数“当做”属性访问,从而提供更加友 ...

  6. BootStrap 智能表单系列 五 表单依赖插件处理

    这一章比较简单哦,主要就是生产表单元素后的一些后续处理操作,比如日期插件的渲染.一些autocomplete的处理等,在回调里面处理就可以了, demo: $("input.date-pic ...

  7. Codeforces 116C - Party(dfs)

    n个人,每个人之多有一个上司.“上司”关系具有传递性.求最少将人分成多少组,每组中的每个人的上司或者间接上司都不在该组.拿到题就用树的直径wa了一炮... 正解是有向无环森林的最长路.从每个跟节点df ...

  8. android五种布局模式

    Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:LinearLayout (线性布局),FrameLayout(框架布局),AbsoluteLayout(绝对 ...

  9. ThinkPHP第十七天(隐藏index.php和简短路径配置)

    1.路由设置,让路径中不显示index.php方法: 第一步:在apache中的httpd.conf中查找: LoadModule rewrite_module modules/mod_rewrite ...

  10. 关于Class.forName(“com.mysql.jdbc.Driver”)--转

    传统的使用jdbc来访问数据库的流程为:Class.forName(“com.mysql.jdbc.Driver”);String url = “jdbc:mysql://localhost:3306 ...