数组指针和指针数组
指针和数组的区别
首先我们编写如下代码:
#include<stdio.h>
#include<stdlib.h>
int main(){
char *s1 = "hello";
char *s2 = "hello";
char a1[] = "hello";
char a2[] = "hello";
printf("%p %p %p %p \n",s1, s2, a1, a2);
return 0;
}
程序运行结果:
从结果可以看出,第一个和第二个 “hello” 的地址都为 “0000000000404000” ,原因是这个时候的数指针指向的 “hello” 为字符串常量,它存放在静态存储区(静态存储区的特点是,内存从分配之后一直到程序结束才会被回收),因此,对于两个 “hello” 这样的字符串常量它的值是一样的,所以 s1、s2 实际指向的是同一个 “hello” ,因此看到的地址是相同的;对于 a1、a2 而言,它们是局部变量,放在栈上,栈上的内容是可以随时修改的,它们是指向两个不同的 “hello” ,它的值可以改为其它内容,因此这里一共有 3 个 “hello”。
*s1 = ‘H’; // 错误,*s1 为字符串常量,不可以修改
*a1 = ‘H’; // 正确,a1[]为局部变量,可以修改
s1++; // 正确,s1 是地址变量,可以修改
a1++;