一、指针和数组的区别
组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
1、从编译器的角度进行区分
指针在定义的时候,编译器并不会为指针所指向的对象分配内存空间,它只是分配指针变量的空间。除非以一个字符串常量对其进行初始化。下面的定义创建了一个字符串常量(为其分配了内存空间)
char *p = "abcd";
在ANSI C中,初始化指针时所指向的字符串被定义为只读,如果想通过指针修改字符串的时候,会产生未定义的行为。
数组也可以用字符串常量进行初始化,但是其内容可以被修改。
int a[5];
int *b;
编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值是一个常量,指向一段空间的起始地址。声明一个指针变量时,编译器只为指针本身保留内存空间,它并不为任何整型值分配内存空间。并且指针未初始化为指向任何现有的内存空间。
此外,c标准对指针的解释:指针是一个变量,变量的值是另外一个变量的地址。那么,既然指针是变量,那么指针必然有自己的存储空间,只不过是该存储空间内的值是一个地址值,而不是别的内容。