二维数组数和指针操作的理解

#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]在此表示一个字符串指针。

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

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

相关文章

最近重构公司消息服务的架构设计

目标 研发一套独立的消息系统&#xff0c;此系统进行集中配置管理供各业务系统使用&#xff0c;用于支撑站内信、短信通知、短信验证码、邮件、微信消息、APP消息、IM等消息形式。 架构 1&#xff09; 基于消息队列采用发布、订阅模式。消息的生产者为对外的消息接口&#xff0…

高性能的MySQL(6)查询慢与重构查询

只有好的库表结构、合理的索引还不够&#xff0c;我们还需要合理的设计查询&#xff0c;齐头并进&#xff0c;一个不少才能充分发挥MySQL的优势。一、查询为什么会慢&#xff1f;每一个查询由一系列的子任务组成&#xff0c;每个子任务都会消耗一定的时间。这个我们在之前的单个…

一道大小端题目

今天看到一道关于大小端的题目&#xff0c;觉得很有趣&#xff0c;理解一番后摘抄如下&#xff1a; 题目&#xff1a; 示意图&#xff1a; 结果说明&#xff1a; 小端模式 大端模式

算法复杂度速查表

图例 数据结构操作 数组排序算法 图操作 堆操作 大 O 复杂度图表 Big O 复杂度 推荐阅读 Cracking the Coding Interview: 150 Programming Questions and Solutions[33] Introduction to Algorithms, 3rd Edition[34] Data Structures and Algorithms in Java (2nd Edition)…

遇到异常:这可能是由某个扩展导致的

重构机房收费系统&#xff0c;我用EA画完UML图&#xff0c;打算用EA自己生成VB.NET代码&#xff0c;这样会方面些。没想到事情没有我想象的那么简单&#xff0c;可能是第一次尝试的原因&#xff0c;导入代码的过程中问题是一个接着一个。不过还好&#xff0c;虽然沿途困难重重&…

文件IO——文件IO相关概念

1、API &#xff08;1&#xff09;基于linux做应用开发&#xff0c;其实就是通过调用linux系统提供的API来实现。 &#xff08;2&#xff09;API 是一些由linux系统提供的函数&#xff0c;给应用层使用&#xff0c;以完成一定的功能。 &#xff08;3&#xff09;常用的文件IO的…

git使用小记

1. 基本操作 全局配置&#xff1a; git config --global user.name xx git config --global user.email xxx 初始化一个仓库&#xff1a; git init 添加&#xff1a; git add "file1.txt" git commit -m "添加文件1" 比较&#xff1a;分别列出每个文件…

LINUX内核之普通自旋锁

LINUX内核之普通自旋锁 CopyLeft by ICANTH&#xff0c;I Can do ANy THing that I CAN THink&#xff01;~ Author&#xff1a;WenHui&#xff0c;WuHan University&#xff0c;2012-6-15 PDF版阅读地址&#xff1a;http://www.docin.com/p1-424285718.html 普通自旋锁 自旋锁…

MFC COMBO-BOX最详细教程

找了好多&#xff0c;这是讲的最清楚的&#xff0c;与大家共享&#xff01; 转&#xff1a;https://blog.csdn.net/fym0121/article/details/7515862 当你只需从一列对象中选出一个时&#xff0c;使用COMBO BOX是一个好主意&#xff0c;因为它节省空间。这篇文章讲述了如何使…

uboot源码——主Makefile的分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客&#xff1a;u-boot Makefile完全解读_williamwang2013的博客-CSDN博客 参考博客&#xff1a;U-boot主Makefile分析_XiaoBaWu的博客-CSDN博客 参考博客&#xff1a;U-boot配置及编译阶段…

Designing Virtual Connect for vSphere 5.x

Designing Virtual Connect for vSphere 5.x如何在 HP C7000刀笼使用VC以满足vSphere 5.x 英文视频连接如下&#xff1a;http://professionalvmware.com/2013/05/vbrownbag-follow-up-designing-virtual-connect-for-vsphere-with-joe-clark-elgwhoppo/1&#xff1a;首先介绍一…

VMware vCenter Converter 关闭SSL加密,提高35-40%性能

VMware vCenter Converter 关闭SSL加密,提高35-40%性能原文&#xff1a;http://www.vmwarearena.com/2013/07/improving-transfer-rate-of-p2v-and-v2v.htmlVMware vCenter Converter Standalone 5.0 is a free tool from VMware to easily perform P2V(Physical to virtual co…

图像拼接算法及实现

第一章 绪论 1.1 图像拼接技术的研究背景及研究意义 图像拼接(image mosaic)是一个日益流行的研究领域&#xff0c;他已经成为照相绘图学、计算机视觉、图像处理和计算机图形学研究中的热点。图像拼接解决的问题一般式&#xff0c;通过对齐一系列空间重叠的图像&#xff0c;构…

程序员,你还在 Select * 吗?

应用程序慢如牛&#xff0c;原因多多&#xff0c;可能是网络的原因、可能是系统架构的原因&#xff0c;还有可能是数据库的原因。 那么如何提高数据库SQL语句执行速度呢&#xff1f;有人会说性能调优是数据库管理员&#xff08;DBA&#xff09;的事&#xff0c;然而性能调优跟程…

学习笔记-记ActiveMQ学习摘录与心得(二)

上个周末被我玩过去了&#xff0c;罪过罪过&#xff0c;现在又是一个工作日过去啦&#xff0c;居然有些烦躁&#xff0c;估计这几天看的东西有点杂&#xff0c;晚上坐下来把自己首要工作任务总结总结。上篇学习博客讲了ActiveMQ的特性及安装部署&#xff0c;下面先把我以前启动…

谈谈C#中的三个关键词new , virtual , override(装载 Winner.Net)

C#支持单继承&#xff0c;说到继承就不得不说new&#xff0c;virtual和override这三个关键词&#xff0c;灵活正确的使用这三个关键词&#xff0c;可以使程序结构更加清晰&#xff0c;代码重用性更高。 以下是msdn中对new&#xff0c;virtual和override的定义&#xff1a; …

unsigned char s1 : 2的用法

#include<stdio.h> #include<stdlib.h> //默认按照四字节对齐 //#pragma pack(1) union V {struct X{unsigned char s1 : 2;unsigned char s2 : 3;unsigned char s3 : 3;} x;unsigned char c; } v; //#pragma pack()int main(void) {v.c 100;//对应的二进制数字是…

juc线程池原理(六):jdk线程池中的设计模式

一、jdk中默认线程池中的代理模式 单例类线程池只有一个线程&#xff0c;无边界队列&#xff0c;适合cpu密集的运算。jdk中创建线程池是通过Executors类中提供的静态的方法来创建的&#xff0c;其中的单例类线程池的方法如下&#xff1a; public static ExecutorService newSin…

Code First :使用Entity. Framework编程(6) ----转发 收藏

Chapter6 Controlling Database Location,Creation Process, and Seed Data 第6章 控制数据库位置&#xff0c;创建过程和种子数据 In previous chapters you have seen how convention and configuration can be used to affect the model and the resulting database schema.…

计算多个文档之间的文本相似程度

首先我们上代码&#xff1a; from sklearn.feature_extraction.text import CountVectorizer corpus [ UNC played Duke in basketball, Duke lost the basketball game, I ate a sandwich ] vectorizer CountVectorizer(binaryTrue,stop_wordsenglish)#设置停用词为英语&…