什么是指针?

xiaoxiao2021-02-28  51

当接触到这个问题的时候,我也是一脸懵逼的,到底什么是指针,它又是干什么用的?一搜索百度,一连串的专业术语把我整的一愣一愣的。总的来说吧,指针其实就是存有地址的变量,就和其他变量一样,他也有着自己的类型,唯一的区别就是,他在定义时需要加一个*号,就比如这样,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

可以看出pchpapd在加一之后,都是增加了一个他所代表的整个类型。

 

而对于指向数组的指针,我们称之为数组指针,这里尤为一点需要注意的是,数组的数组名代表数组首个元素的地址。因此。在某些场合我们可以将数组名当作一个指针看待

例如: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;

}

 

所以,在使用数组名作为一个指针的时候,一定不要疏忽它与真正的指针之间的不同之处,不然计算机可是不会搭理你的哦。

转载请注明原文地址: https://www.6miu.com/read-71815.html

最新回复(0)