OK,我们接下来学习 数组指针中的指向一维数组,学习之前,我们先要了解一下什么是“数组指针”,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。
代码如下:这里呢,数组和指针他们几乎类似,指针也可以以数组的方式输出出来,并且数组地址 a=&a[0]=首地址
#include<stdio.h> int main(void) { int *p,a[]={1,2,3,4,5,6}; p=a;// 另一种写法 p=&a[0]; printf("%d",*p); }
代码调试截图如下:输出结果为 1 ,也就是输出了 a[0]的数值,
但是我们a[]数组里面的其他数值我们也想输出出来,要怎么操作呢?那么 ,接下来我们要对这个指针 进行“地址偏移”,代码如下:
#include<stdio.h> int main(void) { int *p,a[]={1,2,3,4,5,6}; p=a;// 另一种写法 p=&a[0]; for(int i=0;i<6;i++) printf("%d %d\n",*(p+i),p+i); }
代码调试截图如下:我们通过观察发现,我们地址偏移 虽然代码中 指针p的数值+1,但是 实际输出时,p的数值却+4,那是因为,编译器会根据该指针的类型而决定加多少,这里 指针p为整数型,所占内存大小为4个字节,所以每次偏移一个单位时,会自动将指针p的数值增加4
当然,不用小括号也可以使用中括号来实现,代码如下:
#include<stdio.h> int main() { int *p,a[]={0,1,2,3,4,5}; p=a; for(int i=0;i<6;i++) { printf("a[%d]=%d,&a[%d]=%d,p[%d]=%d,*p[%d]=%d\n",i,a[i],i,&a[i],i,&p[i],i,p[i]); } return 0; }
代码调试截图如下:观察调试输出结果。数组的第一个数组元素a[0]的地址(首地址)为“6487536”,第二个数组元素a[1]的地址为“6487540”,第三个数组元素a[2]的地址为“6487544”这与我之前的文章“数组的内存分配”匹配,因为是整数型数组,整数型大小是4个字节,所以每个元素的内存地址连续且相邻相差4个字节,
好的,我们接下来学习,数组指针 指向 字符串,也就是 数组指针 指向 字符类型的数组(字符串),代码如下:
其中,输出时,%s必须要和内存地址对应,我在 第十章 中讲到过,当然我们也可以用,%c一个字符一个字符的输出出来(太繁琐了)
#include<stdio.h> int main(void) { char *p,a[]={"Hello world!"};//字符串结尾符号 '\0' p=a;// 另一种写法 p=&a[0]; printf("%s\n",p); //%s必须要和内存地址对应! for(int i=0;i<13;i++) printf("%c",p[i]); }
代码调试截图如下:
OK,接下来学习,数组指针 指向 二维数组,我们根据我们之前学的,二维数组的内存分部规律,我们可以直接类似指向一维数组一样地进行内存地址偏移,从而得到二维数组的内容,代码如下:
与指向一维数组不同的是,指针的初始地址和一维数组不同,这里大家记住就行了
#include<stdio.h> int main(void) { int *p,a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; p=a[0];// 另一种写法 p=&a[0][0]; for(int i=0;i<12;i++) printf("%d\n",*(p+i)); }
代码调试截图如下:
评论2