当前位置: 首页 > news >正文

仲恺建设局网站最近中美关系最新消息

仲恺建设局网站,最近中美关系最新消息,获取网站访客qq号码代码,做网站自动赚钱前言 指针其实是我们学习C语言中最难的知识点#xff0c;很多人在学习指针的时候会被绕晕#xff0c;包括博主也是#xff0c;当初百思不得其解#xff0c;脑袋都要冒烟了#xff0c;本来打算在学习指针的时候就写一篇博客#xff0c;但是当初自己的能力还是没有办法去完…前言 指针其实是我们学习C语言中最难的知识点很多人在学习指针的时候会被绕晕包括博主也是当初百思不得其解脑袋都要冒烟了本来打算在学习指针的时候就写一篇博客但是当初自己的能力还是没有办法去完成这个壮举但今时不同往日如今也算是一名精通C语言的学生了所以前来编写一篇关于指针的博客。         本篇博客会让你对指针和数组的了解更深一步你会发现其实数组和指针并没有什么区别你也会知道数组指针其实存的就是数组的地址而数组的地址是比里面元素的地址还要高一级的指针这里我只会讲解一级数组指针毕竟指针是可以无限套娃的讲一个就理解多个了         如有表达不清晰或错误请大家在评论区帮我指正让我们的学习可以更加完善而博主也会不断的来更新和修改 学习目标 首先要搞懂什么是取地址( )什么是解引用( * )以及指针的加法学习一级指针二级指针搞懂 数组指针和指针数组、一维、二维数组名、二维数组的行、数组名 一、理解取地址、解引用*和指针的加法 取地址很好理解就是对一个变量取出它的地址然后我们要用指针类型来接收这个地址所以既然指针可以接收地址那就说明指针就是地址 而指针最重要的其实就是解引用和指针的加法这篇博客会让你理解什么是解引用和指针的加法深入理解指针变量的解引用 与 加法运算-CSDN博客 二、快速学习一级指针和二级指针 1. 一级指针 一级指针其实存的就是非指针变量的地址可以是各种非指针类型的地址 而一级指针也是一个变量变量一定占空间有空间就要有地址所以一级指针也是有地址的千万不能认为一级指针没有地址 char c 2;char *pc c; //存char变量的地址short s 1;short *ps s; //存short变量的地址int i 3;int *pi i; //存int变量的地址double d 4.5;double *pd d; //存double变量的地址float f 5.6f;float *pf f; //存float变量的地址//无符号等基本数据类型struct List l;struct List *plist l; //存结构体stuct 变量的地址union All all; union All *pall all; //存联合体union变量的地址enum、位段等自定义类型 这里面没有涉及对数组的取地址因为比较特殊会放在这里讲 2. 二级指针 二级指针对一级指针取地址可以是各种指针类型的地址 所以二级指针就是存放一级指针的地址的指针变量那同理二级指针也是有地址的这样就可以实现无限套娃三级指针、四级指针、n级指针 char c;char *pc c; char **ppc pc;short s;short *ps s; short **pps ps;int i;int *pi i; int **ppi pi;double d;double *pd d; double **ppd pd;float f;float *pf f; float **ppf pf;//无符号等基本数据类型struct List l;struct List *plist l; struct List **pplist plist;union All all;union All *pall all; union All **ppall pall;//enum、位段等自定义类型 三、指针数组 1. 指针数组的介绍 我们先来学习指针数组的原因就是比数组指针好理解并且数组名和二维数组的行都是和数组指针有关系的。         那什么是指针数组呢         指针数组顾名思义是一个数组数组元素都是指针类型的说白了指针数组就是存放地址的数组。 int arr[5] {1,2,3,4,5}; int *arr[5] {arr, arr 1, arr 2, arr 3, arr 4}; 既然有二级指针、三级指针、四级指针等等就一定会有一级指针数组、二级指针数组和三级指针数组等等后面的数组指针也是一个道理所以我们在这里就仅仅讲解一级指针数组 int **arr[5]; //二级整型指针数组 char ***ch[5]; //三级字符型指针数组 2. 指针数组的计算 我们另外一篇文章知道了解引用是根据指针的数据类型除*之外来访问字节的所以直接看下面的例题 温馨提示第三个printf语句需要了解大小端字节序才可以解决问题 #include stdio.h int main() {int arr[5] {1,40000,3,4,5};int *parr[5] {arr, arr 1, arr 2, arr 3, arr 4};printf(%d\n, **parr);printf(%d\n, **(parr 1));printf(%d\n, *parr[1]);printf(%d\n, *(char*)parr[1]);return 0; } 第一个printf 首先 **parr 先看parr 这是一个数组名是首元素的地址也就是arr的地址那parr的数据类型就是int**parr解引用是根据 int* 来的也就是拿出一个指针类型大小的字节指针类型在32位机器下是4字节在64位机器下是8字节取出了arr那**parr 本质上就是*arrarr是首元素地址类型是int*那*arr解引用就是根据int来的拿出了一个int类型的大小4字节所以**parr 1 图解如下 第二个printf  同理这里就是用到了指针整数parr的数据类型是int **那parr 1是根据int *来加 的也就是往后移动一个指针类型的大小后面的过程都跟第一个相同 图解如下 第三个printf 就是典型的用下标访问数组元素但是在这里你就会发现 *(parr 1) 和 parr[1]是等效的那我们就可以使用指针的方式和数组下标一起来访问数组元素因为这是等价的 图解如下 第四个printf 这里就涉及到一个强制类型转换也就会导致我们解引用的时候取出来的字节数是改变的 具体结果和大小端有关 大端字节序低地址存放高数字位 小端字节序低地址存放低数字位 这里我们能快速地找到parr[1]是arr 1 这个地址然后被强制转换为char*类型这也就表明了解引用的时候只能取出char类型的字节1字节。然而这里涉及一个大小端的问题解引用的时候是从低地址开始解引用一个字节一个字节取所以经过char*强转取出来了只有地址最低的一个字节也就是40转换为十进制就是64这是基于小端字节序的结果 图解如下 大端字节序的结果为9c 156 四、数组名和指针 终于到了我们的数组名和指针这里了这里会将数组名和数组指针一起对比着来讲解大家最好要知道啥是数组指针就行数组指针就是一个指向整个数组的指针。知道这些我们就开始学习吧 1. 数组名 我们都知道 数组名表示的是数组首元素的地址但是有两个特例表示的是整个数组的地址 表示整个数组的地址 数组名sizeof(数组名) 这里想讲解一下 arr仅仅是一维数组的数组名 int arr[5] {1,2,3,4,5}; 首先我们知道arr是整个数组的地址也就是其数据类型必须是这样 int (*) [5]这也就证实了其实数组名的本质就是一个数组指针。         那怎样来理解这个类型呢         首先我们要让编译器 arr 知道是整个数组的地址那就必须让编译器知道有几个数组元素所以我们会加上[ ]这里大家简单理解一下就行。最后我们只需要知道arr表示的是整个数组的地址就行。 接下来看一下下面的题 #include stdio.h int main() {int arr[5] {1,2,3,4,5};printf(%p\n, arr);printf(%p\n, arr);return 0; } 运行的结果是什么呢整个数组的地址是啥样的呢 我们惊喜地发现整个数组的地址居然和数组首元素的地址是一样的那是真的一样吗继续看下面的代码 #include stdio.h int main() {int arr[5] {1,2,3,4,5};printf(%p\n, arr);printf(%p\n, arr 1);printf(%p\n, arr); printf(%p\n, arr 1);return 0; } 我们会发现arr 1跳过了20个字节也就是5个元素的大小         所以虽然整个数组的地址和数组首元素的地址是一样的但是加一之后移动的字节是不同的本质上是因为数据类型的不同导致的。         arr的数据类型int * arr的数据类型是 int(*)[5] 2. 二维数组名 二维数组名同样也适用于对数组名的规则 先说结论二维数组的数组名 二维数组第一行的地址 下面代表的运行结果是什么呢 #include stdio.h int main() {int arr[2][2] {{1,2},{3,4}};printf(arr: %p\n, arr);printf(arr 1: %p\n, arr 1);return 0; }结果是移动了8个字节也就是两个int类型的大小啊两个int类型的大小不就是第一行吗所以通过这个现象可以知道二维数组的首元素是整个第一行所以二维数组的数组名就是整个第一行的地址啊 3. 二维数组的行 二维数组的行是表示该行这个一维数组的数组名是该行首元素的地址 讲解二维数组的行之前         大家先想一下一维数组的每个元素是什么         通过一维数组能不能推出二维数组的每个元素是什么呢 int arr[2][2] {{1,2},{3,4}}; 不难想出二维数组的每个元素其实就是每一行的一维数组因为上面也隐含了二维数组的数组名是第一行的地址而数组名又是首元素的地址那就侧面印证了二维数组其实就是一维数组的数组。但是这跟我们的行有什么关系呢接下来就是要学习的知识了 大家先理清一下思路二维数组的行是什么二维数组的行就是第一个方括号[ ]而我们要访问一个一维数组元素的时候是这样访问的 int a[5] {1,2,3,4,5}; a[1] 8; 访问二维数组的第一行的元素是这样访问的 int arr[2][2] {{1,2},{3,4}}; arr[0][1] 8; 它们之间的共同之处 都要用数组名下标引用 一维数组arr [1] 二维数组arr[0] [1] 所以我们会发现二维数组的行其实就相当于一维数组的数组名既然二维数组的行相当于一维数组的数组名了那就是首元素的地址arr[0] arr[0][0] 我们学完这些根本上来说二维数组就可以相当于一级数组指针的数组了 数组和指针拓展知识 a[ i ]  *( a i )b[ x ][ y ]  *( b[ x ] y ) *( *( b x ) y ) 五、数组指针 终于来到数组指针了 数组指针顾名思义是一种指向数组的指针 我们只讨论一级数组指针多级数组指针大家有兴趣可以私信我 我们来思考这样一个问题既然一个指针是可以指向整个数组的并且指针是存放地址的变量那数组指针是如何做到指向整个数组的呢         其实不难理解我只要存放整个数组的地址就可以了呀那如何存放数组的地址呢别忘了数组名代表的就是整个数组的地址哦而数组名中的数组名是首元素地址但是对首元素地址取地址那不就相当于一个二级指针了吗既然这样数组指针就相当于一个二级指针那二维数组名实际上也相当于一个二级指针这也是为什么数组指针和二维数组名拿元素要解引用两次的原因         但是解引用要涉及到数据类型那数组的数据类型又是什么呢 int arr[5] {1,2,3,4,5}; int (*parr) [5] arr; 提到这里就不得不拓展一个知识点int arr[5]是一个数组那这个数组的类型是什么呢大多数人都没有去研究过吧我们不妨可以通过以往的经验来看         比如 int a 的 a是一个变量名a 的类型是 int double d 的 d是一个变量名类型是double那int arr[ 5 ]的变量名是什么呢没有变量名一定有数组名所以数组名是arr那数据类型是int [5] 这表示这个变量arr是一个数组类型是一个有5个int类型的数组。 因为解引用和加法是涉及到类型的问题所以我们必须要明白数组指针的数据类型是什么虽然我上面说了数组指针是相当于二级指针的但是仅仅是为了让我们来理解 解引用2次的原因。         那到底数组指针的数据类型到底是什么呢         首先依旧是拿出数组名parr剩下的就是数据类型int (*) [5]这个的意思就是为一个数组的指针类型但是这里还有数组元素的个数只有知道元素个数解引用的时候才知道拿出来多少字节加的时候才知道移动多少字节。         *表示这是一个指针int 表示 元素类型而[5]表示有多少个元素 对于加法数组指针移动的是整个数组的大小 对于解引用作者目前没有搞懂深层但是有一种方法简单易懂         因为parr 是 arr那 *parr 就是 *arr * 和 相互抵消了就是arr这样我们也就是可以理解为啥是指针降级了。         所以*parr arr那对*parr的解引用或者是加法就是对arr来的。 六、总结 其实我们对指针和数组这里的考点基本都是在解引用和指针➕整数这里出题因为对于学C的大家这里算是难题了它往往可以伴随着强制类型转换隐式类型转换和大小端字节序等多方面出题但是万变不离其宗你只要弄清是啥数据类型就OK仔细画图就一目了然了。 最后给大家推荐一下我的C语言刷选择题的专栏这里是我在牛客网上精选出来的题里面有我的个人解析如有错误请大家指正有不懂的不会的可以私信哦 https://blog.csdn.net/2302_76941579/category_12492707.html?spm1001.2014.3001.5482
http://www.pierceye.com/news/456122/

相关文章:

  • 岳阳网站开发建设网站域名注册申请
  • 营销型网站建设ppt网站程序开发后怎么上线
  • 鞍山做网站哪家好制作网站技术
  • 中国建设银行山西省分行网站wordpress永久免费
  • 设计网络网站做国外网站 国外人能看到吗
  • 融安有那几个网站做的比较好的创建网站大约
  • 浙江联科网站建设选择宁波seo优化公司
  • 上海建站网络科技app营销策略有哪些
  • 怎么检查网站有没有被挂马知乎做笔记的网站
  • 温岭网站制作爱网站查询
  • 徐州学习网站建设影视公司组织架构
  • 怎么看别人的网站有没有做301蓝色扁平化企业网站
  • 郑州建站模板网络程序员
  • 健身顾问在哪些网站做推广北京网络推广外包公司排行
  • 天津网站开发工资水平建设网站如何写文案
  • 做a漫画在线观看网站注册个免费网站
  • 杭州网站设计网页长安东莞网站推广
  • 福州网站建设软件怎样上传自己的网站
  • wordpress手机站如何做wordpress 查询文章
  • 企业专业网站设计公wordpress打开慢
  • 网站制作方案怎么做青岛住房和城乡建设部网站
  • 织梦系统做的网站忘记登录密码百家 主题 wordpress
  • 营销推广软文婚纱摄影网站seo方案
  • 上海网站制作网站建设汶川县建设局网站
  • 东莞seo网站推广怎么做能够让网站流量大
  • 郑州网站建设做推广吗灰色关键词排名方法
  • 在线推广企业网站的方法有哪些网站推广到海外怎么做
  • 怎么用视频做网站首页php网站开发职位
  • 网站平台怎么做typecho跟wordpress
  • 网站建设找什么公司微网站建设流程