当接触到这个问题的时候,我也是一脸懵逼的,到底什么是指针,它又是干什么用的?一搜索百度,一连串的专业术语把我整的一愣一愣的。总的来说吧,指针其实就是存有地址的变量,就和其他变量一样,他也有着自己的类型,唯一的区别就是,他在定义时需要加一个*号,就比如这样,int *p, 在32位的编译器下,指针都是4个字节。指针身为变量,当然也可以进行正常的加减,但是它与普通变量的运算不同的是,指针的加减所加所减的是指针所指向的类型,比如下面这个例子
#include <stdio.h>
// 关于指针类型的加减:
// pa + n = pa + sizeof(指针所指向的类型)*n
int main()
{
int a; int *pa = &a;
char ch; char *pch = &ch;
double d; double *pd = &d;
printf ("pch = %p\n", pch);
getchar();
pch++;
printf ("pch = %p\n", pch);
printf ("pa = %p\n", pa);
getchar();
pa++;
printf ("pa = %p\n", pa);
printf ("pd = %p\n", pd);
getchar();
pd++;
printf ("pd = %p\n", pd);
return 0;
}
“&”为取地址符,因为指针所存的是变量的地址,所以要使用取地址符将指针所指向的变量地址取出来。
程序结果为:
pch = 0xbff9295f
pch = 0xbff92960
pa = 0xbff92960
pa = 0xbff92964
pd = 0xbff92950
pd = 0xbff92958
可以看出pch、pa、pd在加一之后,都是增加了一个他所代表的整个类型。
而对于指向数组的指针,我们称之为数组指针,这里尤为一点需要注意的是,数组的数组名代表数组首个元素的地址。因此。在某些场合我们可以将数组名当作一个指针看待
例如:int main ()
{
int a[5] = {1,2,3,4,5};
printf ("%d\n", *a);
printf ("%d\n", *(a+1));
printf ("%d\n", *(a+2));
printf ("%d\n", *(a+3));
return 0;
}
但是,数组名与指针也是有着差异的。
// 数组指针与数组的差异1:数组指针不能代替数组名求数组长度
int main5()
{
int a[5];
int *p = a;
printf ("%d\n",sizeof(a));
printf ("%d\n",sizeof(p));
return 0;
}
// 数组指针与数组的差异2:数组是一个常量,不能改变
int main()
{
int a[5] = {1,2,3,4,5};
int *p = a;
int i;
for (i = 0; i < 5; i++)
{
printf ("%d\n", *(p++));
}
for (i = 0; i < 5; i++)
{
printf ("%d\n", *(a++));
}
return 0;
}
所以,在使用数组名作为一个指针的时候,一定不要疏忽它与真正的指针之间的不同之处,不然计算机可是不会搭理你的哦。
