提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
数组离不开指针,因为数组在一定程度上就相当于指针。
一、为什么数组与指针关系密切?
因为p[i]就相当于*(p+i)。举个例子p[5]:那么p[5]就相当于*(p+5),p[5]就是p数组中第六个元素,它距离第一个元素的地址相差5,上一个帖子指针2说过指针可以做减法,那么此处加法就相当于一个变相的减法,因为数组地址都是连着的,所以它将p(第一个元素的地址)加上5后,就来到了第六个元素的地址p+5,此时*(p+5)就相当于第六个元素,也就是p[5]。
二、代码如下
/*本代码主要作用就是通过指针来输出一个数组中所有元素*/
# include <stdio.h>
void f(int *p, int leng)//发送的数组的地址,就要用指针变量来接收
{
int i;
for(i = 0; i<leng; ++i)//通过循环来输出数组所有元素
{
printf("%d %d\n", *(p+i), p+i);/*利用上面说的来把所有元素输出,同时把每个元素的
地址编号输出*/
}
//void类型无返回值。
}
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个数组
f(a, 10);/*将数组的首地址--也就是a发送给f函数,将数组的长度发送给f函数*/
return 0;
}
输出结果
1 6487536
2 6487540
3 6487544
4 6487548
5 6487552
6 6487556
7 6487560
8 6487564
9 6487568
10 6487572
--------------------------------
Process exited after 0.01434 seconds with return value 0
请按任意键继续. . .
三、对输出地址结果的分析
1、为什么相间4?
在内存条中,一字节有八位(也就是八个bit),它用一个地址来储存。而一个指针变量所占的内存用来储存的是数组每个元素的首地址,为什么是首地址呢?因为该数组是int类型,每个元素占四个字节,有四个地址编号,但指针变量被开发C语言的人限定只能储存int数组每个元素的首地址,每个首地址用其所对应的指针变量所有的内存来储存,但每个元素又有四个字节,所以它们的首地址之间相差4,所以输出结果之间相差4,这个4指的是int数组每个元素相差的首地址编号的值,输出结果指的是每个元素的首地址(因为代码中的p+i储存的就是每个元素的首地址)。
2、指针变量无论储存什么类型的数据其本身都占相同字节吗?
yes!
话不多说,上代码
# include <stdio.h>
int main()
{
char a = 'A';
int i = 5;
double j = 10;
float k = 1;
char *p1 = &a;
int *p2 = &i;
double *p3 = &j;
float *p4 = &k;
printf("%d %d %d %d", sizeof(p1), sizeof(p2), sizeof(p3), sizeof(p4));
return 0;
}
输出结果:
8 8 8 8
--------------------------------
Process exited after 0.01124 seconds with return value 0
请按任意键继续. . .
注:sizeof函数此处用来返回每个指针变量所占字节数,字节数就是sizeof的返回值。
总结
这次主要说了指针和数组的密切联系,在学习完这块知识以后,我感觉基本上数组就是指针,它们表面形式不同但根本上都是与地址有关的。利用数组每个元素的地址紧挨着,就可以利用指针变量来对数组进行很方便的操作而不仅仅是把数组元素全部输出,明白了这个以后,我感觉只要是数组,指针基本上就可以拿捏它了。