指针详解(二)——字符指针、指针数组、数组指针 目录 字符指针 指针数组 指针数组如何分辨数组中素类型: 数组指针 如何正确写出能指向数组的指针 注意如何分辨是指针数组还是数组指针: 数组指针的使用 数组名和&数组名 通过指针详解(一)我们已经了解到: 指针变量存储的是地址,每个地址唯一标识一个内存空间指针的大小为4/8个字节指针是有不同类型的,类型决定了指针+-整数的步长以及指针解引用所访问的字节大小指针的运算二级指针的指向是一级指针的地址 现在开始新的知识归纳 字符指针 指针类型有char*类型,这种类型就叫做字符指针 字符指针的一般使用方法: 这里就是将字符变量m的地址赋予指针变量p; 字符指针的另一种使用方法: 这里字符串的地址就是字符串首素的地址,即c的地址,所以对指针p解引用并以字符的形式打印时,这里只能打印出首素c;而指针变量p的值其实就是字符串首素的地址,我们知道要打印一串字符串,只要给出字符串的首地址即可,所以我们只要提供指针变量p然后通过字符串的形式打印即可打印出csdn; 注意:这里的csdn其实就是一个常量字符串 给出一道题目以便我们分清楚字符串、字符串数组和字符指针 可以看到用一个字符串去赋给两个不同的变量,两个变量的地址是相同的,因为两个变量的地址都是首素b的地址; 而给两个字符串数组赋予同一个字符串时,两个数组的首地址并不相同,因为两个数组分别开辟了两个内存空间,里面的字符串虽然相同,但是所处的内存空间是不同的;
而两个指针变量都是指向同一个字符串的首素地址,所以它们的值是相同的。
指针数组 指针数组,本质上还是数组,只不过数组里面存放的都是指针 arr里面5个素类型都是int*
以此类推 arr1里面10个素都是二级指针 指针数组如何分辨数组中素类型: 我们要知道[]的优先级比*高除去数组的变量名,剩下的就是变量类型 比如: 数组的变量类型决定数组的素个数以及每个素的类型
数组指针 我们已经了解了有指向整型的指针和有指向字符的指针,同时指针也可以指向数组; 数组指针,主语是指针,是指向数组的指针。 和基础的指针定义一样,我们只需要将数组的地址赋给指针变量即可。 如何正确写出能指向数组的指针 我们要知道一个指针变量除去变量名和一个符号*,剩下的就是该指针所指向的类型 比如: 数组指针也是如此: 首先p是一个指针,因为用()将*和p结合,防止[]的优先级比*高而导致p与[]先结合 指针p指向的内容,即数组类型是int [10],所以数组指针p就变成了int(*p)[10]。 去掉变量名p和*后,便是该数组指针所指向的数组的变量类型,即为int [10]。 注意如何分辨是指针数组还是数组指针: 因为[]的优先级比*高,而()的优先级又比[]高,所以如果变量名与*没有用()括起来,并且变量名与[]相接触的就是指针数组。
而如果加上()后*与p结合则为数组指针
数组指针的使用 此处用一个打印二维数组的案例来分析数组指针应该如何使用 这里打印一个4行5列的二维数组,主函数中arr传参传的是数组的首素地址,也是一维数组的首素地址,要接收一个数组的地址,这里就要是要数组指针*p来接收,用x,y明确打印的范围 解析*(*(p+1)+1)
数组名和&数组名 数组名代表整个数组的地址的情况其实只有两种: &数组名。数组名单独放在sizeof内部,即sizeof(数组名)。 除此之外,所有的数组名都是数组首素地址。 比如 只有以下两种情况才代表整个地址: 除此之外都是首素的地址,即1的地址。
打印出arr即首素的地址与&arr虽然值是一样的,但是两者的类型不同; &arr的类型是数组指针类型 而我们在指针详解(一)中讲过指针类型决定了它+-整数所走的步长
当arr+1后地址增加了四个字节,因为arr的类型是int,int类型所占的字节便为4
&arr[0]的情况和arr是一样的,&arr[0]就是arr中的第一个素,是int类型,+1也是加4个字节; 而&arr就不同了,地址14到3C差了0x28总共40个字节(这里是按十六进制计算的),这里+1跳过了整个数组,而不是跳过一个素
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/24993.html