#include<string.h>
#include <stdio.h>
int main(void)
{int a[4][2] = { { 2,4 },{ 6,8 },{ 1,3 },{ 5,7 } };char *p[5] = { "acvsadf", "cwerqwenn", "tttttt" };//字符串指针数组int c[4] = { 0,1,2,3 };int *ptr = c;/*这个正确,说明a[0]是一个地址,而且只指向一个int类型;也说明它是一维数组(这个数组有两个元素,即2和4)的首元素(这里是2)的地址;+1会加上4个字节,即一个int类型的大小;*/int *p1 = a[0];//int (*p2)[2] = a[0];//error/*这个正确,说明&a[0]是一个地址,而且指向一个包含两个int元素的数组;也说明它是数组(这个数组有4个元素,分别{ 2,4 },{ 6,8 },{ 1,3 },{ 5,7 })首元素(这里是{2,4})的地址;+1会加上8个字节,即两个int类型的大小;*/int(*p3)[2] = &a[0];//[]表示的是该指针指向数组,而数组里面有[?]个元素int(*p4)[2] = a;//这个说明&a[0]和a性质是一样的。//int (*p5)[8] = &a;//error//int (*p6)[4] = &a;//error//int* p7 = &a;//怎样指向整个数组?int* p8 = (int*)a;//这样就达到了对整个数组的访问,这种访问方式和访问一维数组无异。printf("数组名操作:\n");printf("1------------\n");//这些地址是一样的printf("%p\n", a);printf("%p\n", &a[0]);printf("%p\n", a[0]);    printf("%p\n", &a);printf("2------------\n");//a,&a[0]printf("%p\n", a + 1);//a表示数组(退化为1维数组,看做有4个元素)的首元素地址,这里的元素指{2,4},+1会加上8个字节printf("%p\n", &a[0] + 1);//这里&a[0]和a的性质一样printf("%p\n", &a[1][0]);printf("3------------\n");//a[0]printf("%p\n", a[0] + 1);//这里a[0]表示一维数组(这个数组有两个元素,即2和4)的首元素的地址,+1会加上4个字节printf("%p\n", &a[0][1]);printf("4------------\n");//&aprintf("%p\n", &a + 1);//这里&a表示整个数组的首地址,+1会加上8*4=32个字节printf("5------------\n");printf("%d\n", a[0]); //a[0]为啥不是a[0][0]的值?因为它仅是指针,是a[0][0]的地址printf("%d\n", *a[0]);//*a[0]表示的是a[0][0]printf("%d\n", **a);  //*a表示a[0](因为从前面可知a表示&a[0]),**a表示a[0][0]printf("%d\n", a[0][0]);printf("\n指针操作:\n");printf("%p\n", p1 + 1);//和3一样printf("%p\n", p3 + 1);//和2一样printf("%p\n", p4 + 1);//和2一样//char *p[5] = { "acvsadf", "cwerqwenn", "tttttt" };//字符串指针数组printf("\n字符串指针数组操作:\n");/*首先明确这里的p和&p[0]性质一样,则*p即为p[0];p+1即为&p[0]+1,也就是&p[1],则*(p+1)即为p[1];&p[0]可以看做是一个指向一个数组的指针,+1要加上整个数组的大小。*/printf("p               = %s\n", p); //乱码printf("*p              = %s\n", *p); //"acvsadf"printf("(*p)+1          = %s\n", (*p) + 1);//"cvsadf",*p即为p[0],p[0]是指向char类型的指针,因此+1是移动一个char长度单位printf("p[0]+1          = %s\n",  p[0]+1); //"cvsadf",和上面一个应该一样printf("*(p+1)+1        = %s\n",  *(p+1)+1);//“werqwenn”printf("*(p + 1)        = %s\n", *(p + 1));//“cwerqwenn”,注意这里是一个指针,因此是%s打印printf("**(p + 1)       = %c\n", **(p + 1)); //‘c’,注意这里已经是完全解引用了,因此是%c打印得到一个字符printf("*(p[1] + 1)     = %c\n", *(p[1] + 1)); //‘w’printf("*(*(p + 1) + 1) = %c\n", *(*(p + 1) + 1));//'w',注意这里已经是完全解引用了,因此是%c打印得到一个字符/*int c[4] = { 0,1,2,3 };int *ptr = c;*/printf("\n一维数组的操作:\n");printf("1-------------\n");//地址都一样printf("&c   = %p\n", &c); printf("c     = %p\n", c);printf("&c[0] = %p\n", &c[0]);printf("2-------------\n");printf("&c    = %d\n", &c);printf("c     = %d\n", c);printf("&c[0] = %d\n", &c[0]);printf("3-------------\n");printf("&c+1    = %p\n", &c+1);//&c表示整个数组的开始地址,+1的话,会跨越整个数组printf("c+1     = %p\n", c+1);//c和&c[0]性质一样,都表示首元素的地址printf("&c[0]+1 = %p\n", &c[0]+1);//后两个应该一样printf("4-------------\n");printf("*ptr     = %d\n", *ptr);//0printf("*(ptr+1) = %d\n", *(ptr+1));//1printf("c[0]     = %d\n", c[0]);//0getchar();return 0;}

综上记忆为:统一性,即首字母和“&首元素”意义是一样的。

对于int c[4],c和&c[0]是一样的;

  • 解引用后,*c=c[0],表示数组第一个元素的值;
  • &c[0]+1和c+1是一样的,都表示c[1]的地址,即&c[1];

对于int a[4][2],a和&a[0]是一样的;

  • 解引用后,*a=a[0],a[0]表示指向一维数组的指针,可以有指针的操作a[0]+1(此时的a[0]相当于指针,摈弃以前的惯性思维),即a[0][1]的地址&a[0][1];
  • &a[0]+1和a+1是一样的,都表示a[1]的地址,即&a[1];
  • 而a[1]本身就是a[1][0]的地址;
  • 因此由a[1][0]=*a[1]=*(a+1)=*(&a[0]+1);

对于char* p[5],p和&p[0]是一样的。

  • 解引用后,*p=p[0],p[0]表示指向字符串的指针,可以有指针操作p[0]+1,也可以写成p[0][1],这就和二维数组一致了。
  • &p[0]+1和p+1是一样的,都表示p[1]的地址,即&p[1];
  • *(p+1)=*(&p[1])=p[1],而p[1]在此表示一个字符串指针。

二维数组数和指针操作的理解相关推荐

  1. 二维数组与指向指针的指针

    二维数组与指向指针的指针: 以前一直有种误解: 二维数组的是数组的数组,所以数组的首地址是指向第一个元素指针,而这个元素又是一个数组,所以把数组首地址理解为指向指针的指针. #include<s ...

  2. 【C++】二维数组的行指针和列指针

    在C++中,数组与指针有密切的关系.任何通过数组和下标实现的表达式可等价地通过指针和偏移量实现.下面首先介绍一维数组与指针的关系,之后介绍二维数组的行指针和列指针. 1.一维数组和指针 定义一个长度为 ...

  3. 【HDU】1305 Immediate Decodability(字典树:结构体数组,二维数组,链表/指针)

    一.用的二维数组 #include <iostream> #include <cstring> #include <algorithm> using namespa ...

  4. 二维数组和二级指针关系浅析

    昨天写了关于一级指针的见解,即二级数组的用法和二级指针差不多,关于数组指针和指针数组这两个是不同的概念,这一点我们一定要清楚: 数组指针我们可以理解为指向数组的指针,就是一个指针: 指针数组则可以理解 ...

  5. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

  6. 【C 语言】二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )

    文章目录 前言 一.指针数组 二.二维数组 三.自定义二维指针内存 前言 绘制如下 333 种二级指针的内存模型 : // I. 指针数组 char *p1 []= {"12", ...

  7. char二维数组_C语言指针与数组详解

    指针与数组 指针可以与变量结合,也可以与数组结合使用.指针数组和数组指针是两个截然不同的概念,指针数组是一种数组,该数组存放的是一组变量的地址.数组指针是一个指针,表示该指针是指向数组的指针. 1.指 ...

  8. Linux C编程---指针数组简析(二维数组、多级指针)

    讲到指针和数组,先给大家看一道例题: 题目:填空练习(指向指针的指针) 1.程序分析: 2.程序源代码: main() { char *s[]={"man","woman ...

  9. c语言指针怎样代替二维数组,c语言 指针和二维数组

    // 指针和二维数组 #include int main(int argc, const char * argv[]) { int a[3][6]; for (int i=0; i<3; i++ ...

最新文章

  1. 使用Ceph集群作为Kubernetes的动态分配持久化存储
  2. linux mysql 二进制包_mysql5.7 二进制包安装
  3. Swift 绘图板功能完善以及终极优化
  4. python结束进程树_【python爬虫】线程进程
  5. 用tf-faster-rcnn训练自己制作的车牌号数据集(VOC2007格式)
  6. Haproxy反向代理WebSocket的方法
  7. Oracle ora01410,一次ORA-01410故障的解决
  8. PHP程序的常见漏洞攻击分析
  9. C语言程序设计(谭浩强第五版)——例题
  10. ubuntu下使用CPU频率控制
  11. 雅虎搜索架构_雅虎! 想要推动您的网站搜索
  12. 向量范数(Norms)之间关系的证明
  13. 【YOLACT】测试自己数据集
  14. Linux操作系统的pstack工具
  15. 微信公众平台群发消息里,为什么一天只能发一条
  16. docker image 的sha256 digest摘要
  17. Python traceback模块:获取异常信息
  18. 微信小程序页面上面的名字怎么改_微信小程序取名|如何修改名字|取名规则!...
  19. 计算机多媒体处理的是什么意思,多媒体系统是什么意思有什么组成
  20. A律折线与miu律折线

热门文章

  1. Sublime Text3使用Package Control 报错There Are No Packages Available For Installation
  2. 00030_ArrayList集合
  3. P1334 瑞瑞的木板
  4. 转载——java synchronized详解
  5. vNext之旅(2):net451、dotnet5.4、dnx451、dnxcore50都是什么鬼
  6. Audit(查看审核/审计信息)
  7. 数据结构之顺序栈的一些基本操作
  8. Luogu P3975 [TJOI2015]弦论
  9. java接口调试思想
  10. 4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例