前面简单的说了指针,和数组,它们之间又有啥关系呢?此篇就让我来探究一番。
指针与数组的关系:
指针和数组的关系十分紧密。我们知道定义一个数组aint a[10]
,数组名就是数组首元素的首地址,既然是地址,我们就可以定义个指针指向它int *p = a
,我们看一段代码:
#include <stdio.h>
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = a;
int i;
for (i = 0; i < 10; i++)
{
printf ("%d\t",a[i]);
}
printf ("\n");
for (i = 0; i < 10; i++)
{
printf ("%d\t",p[i]);
}
printf ("\n");
return 0;
}
打印下结果:
输出的结果一样,是不是看出了它们间的关系;
但是,我们可千万不要把指针和数组混为一谈:虽然看起来差不多,其实差别可大了。
比如:
#include <stdio.h>
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = a;
printf ("%d\n",sizeof(a));
printf ("%d\n",sizeof(p));
return 0;
}
打印下结果:
可以看出,它们的长度就不一样,其实sizeof(a)
得到的是整个数组的长度,而sizeof(p)
得到的是地址的长度。这里的p只是存了a的地址,它并不能代表a,编译器也只是先从p中取到a的地址然后通过下标取值。
看一幅图来了解下:
a是首元素首地址0x0011ffdd,它存的是一串数,而p的地址存在内存的某一个地方,它存的是a的地址。看出它们本质上的区别了么。
指针数组:
指针数组,顾名思义,它是一个数组,数组里存的是指针。
如:
#include <stdio.h>
int main()
{
int a;
int b;
int c;
int *p[3] = {&a, &b, &c};
for (a = 0; a < 3; a++)
{
printf ("%p\t",p[a]);
}
printf("\n%p\n",p);
return 0;
}
打印下结果:
再看下内存图:
由这幅图我们可以看出,数组名是p,数组的首元素的首地址(由于代码中输出的是p,所以这里不说是数组的首地址,&p的地址才是数组首地址,即使地址是一样的,但是概念不一样)是0x0060FEF8,数组里存的是a,b,c的地址,应该很容易就明白了吧。
数组指针:
数组指针,顾名思义,它是一个指针,指向一个数组。
如:
#include <stdio.h>
int main()
{
int (*p)[3] = {1, 2, 3};
int i;
for (i = 0; i < 3; i++)
{
printf ("%d\t",p[i]);
}
return 0;
}
打印下结果,算了,不打印了,因为打印不出来,为啥,因为编译就通过不了,问题在于第5行给数组指针进行初始化,它是一个指针,怎么能用数组的方法初始化呢,所以编译器是不通过的。如果我们想给它值,只能向下面这样了:
#include <stdio.h>
int main()
{
int a[3] = {1, 2, 3};
int (*p)[3] = &a;
int i;
for (i = 0; i < 3; i++)
{
printf ("%d\t",(*p)[i]);
}
return 0;
}
打印出来:
看下内存图:
从内存图中可以看出,有一个数组,数组里存了3个整型数据,