指针,什么叫指针?
数组,什么又是数组?
指针与数组之间的关系?
这是一个曾经让我感到难于上青天的问题
现在我来替我解答一下,也希望可以帮助到曾经和我一样绕不清的小伙伴。
指针
在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过指针能找到所需要的变量单元,可以的说,地址指向该变量单元。因此,将地址形象化为指针,意思是通过它能找到以它为地址的内存单元。简单的说:指针就是变量,用来存放地址的变量。 存放在指针中的值都被当成地址处理。
我们来看一下示意图:

上图所示,我们把p成为指针变量,p里所存储的内存地址成为p所指向的内存。指针变量p 里存储的任何数据都将被当做地址处理。
可以这么理解:
※ 一个基本的数据类型加上 * 号,就构成了指针类型,指针类型大小是一定的,与 * 号前面的数据类型无关。
※ * 号前面的数据类型只是说明指针所指向的内存里存储的数据类型。
※ 在32位系统下,不管什么样的指针类型,其大小都是4字节。 printf("%d\n", sizeof(void *)); 打印结果是 4 。
数组:
数组是一组相同类型元素的集合。
int arr[5];
这是定义了一个数组,其中包含了5 个int型的数据。

当我们定义一个数组时,编译器会为其分配一块内存,并把这块内存命名为arr ,arr[0],arr[1]...是数组的元素,不是数组的名字,数组的每一个元素是没有名字的。
特别说明:sizeof(arr[5])的值在32位系统下的值为4,这是因为sizeof是关键字,不是函数,关键字求值是在编译的时候。其实并不存在arr[5]这个元素,也并没有真正去访问arr[5],而是仅仅根据数组元素类型来确定其值,所以这里使用arr[5]不会出错。
指针与数组间的关系:
指针就是指针,在32位系统下,指针变量永远占4个字节,存的是某内存地址。指针可以指向任何地方,但不是任何地方都可以通过这个指针变量访问到。
数组就是数组,其大小和元素个数及其类型相关。数组可以存任何类型的数据,不能存函数。
char *p="abcdef";
char arr[]="abcdef";
上述是第一个先定义了一个指针变量p ,占4 个字节,p里存的是一块内存的首地址,这块内存在静态区,其大小为7个字节,没有名字。我们现在要读取e这个字符,有以下两种方式:
以指针的形式:*(p+4) ,先取出p中存放的地址值,加上4得到新的地址值,然后在解引用。
以下标的方式:p[4],编译器会解析成以指针的形式,先取出p中存放的地址值,加上4得到新的地址值,然后从新的地址中取出值。
两种方法本质上没有什么区别。
第二个定义了一个数组arr,拥有7个char类型的元素,大小为7。这个也有两种访问方式:
以指针的形式:*(arr+4) ,arr代表的是数组首元素的首地址,在加上4 ,得到一个新地址,在解引用取出值。
以下标的方式:arr[4],编译器会解析成以指针的形式,arr作为数组首元素的首地址,加上4,计算出新的地址,然后取出值。
4指的是4个元素。
其实数组与指针本身并没有关系,只是比较相似。