C语言中数组与指针的区别

本文是对《C语言深度剖析》一书内容的拓展,在看这本书的时候解了很多我之前的一些困惑,故在此记录。对数组的引用总是可以写成对指针的引用,而且确实存在一种指针和数组的定义完全相同的上下文环境。

但是指针和数组还是在本质上是不一样的。指针就是指针,指针变量在32位的系统下面是4Byte,而在64位系统下面是8Byte,其值为某一个内存的地址。而数组就是数组,其大小与元素的类型和个数有关,定义数组时必须制定其元素的类型和个数,数组可以存放任何类型的数据,但是不能存放函数。

 

1、从变量大小来看指针与数组的区别

#include

int main(){
	char *p = "abcdef";
	char a[] = "abcdef";
	int b[] = {1,2,3,4,5};
	int *ptr = (int*)(&b+1);
	printf("sizeof(p) = %d;\n",sizeof(p));
	printf("sizeof(a) = %d;\n",sizeof(a));
	printf("*(b+1) = %d,*(ptr - 1) = %d;\n",*(b+1),*(ptr-1));	
	return 0;
}

上面的演示程序中,对于指针p的求值是p这个指针的大小,由于测试的操作系统是64位的,所以是8;而对于数组a,它的值就是这个数组的大小了。

后面对于b这个数组,*(b+1)=2非常好理解,其实就相当于b[1];而后者为什么是这样的?(&b+1)其实是取b的首地址,该地址的值加上sizeof(b)的值,即&b+5*sizeof(int),也就是下一个数组的首地址的,显然现在的指针已经越界了。将前者的值赋给ptr,则此时ptr指向的是b[5],在此基础上减一,就是b[4]了,即5。

 

2、指针数组与数组指针

指针数组:首先它是一个数组,这个数组全是指针,数组占用多少个字节有数组本身决定。它是“储存指针的数组”的简称。

数组指针:首先它是一个指针,它指向一个数组。在32位系统下永远占用4个字节,至于它指向的数组占多少个字节,不知道。它是“指向数组的指针”的简称。

如下所示,前者的指针数组,后者是数组指针。

Int *p1[10];

Int (*p2)[10];

如何区分,前者的话[]比*号的优先级要高,所以其一定先是数组,然后才是指针,合起来就是指针数组了。后者也是一个符号优先级的问题,看到(),毫无疑问了。它们的图示如下。

                             C语言中数组与指针的区别_第1张图片

你可能感兴趣的:(C)