以下2个定义有很大的差别
char array[] = “I love you.”;
char *pointer = “I love you.”;
array是一个刚好够存放初始化字符串内容和空字符‘\0’的一维数组
数组存放在动态存储区,数组中的单个字符可以修改
但array始终指向同一个存储位置,不能改变
pointer是一个指针,其初值指向一个字符串常量
字符串常量存放在静态存储区,如果试图修改字符串的内容,会导致segmentatin fault,
pointer可以被修改为指向其他地址
#include<stdio.h>
#include<string.h>
int main()
{
char *str = "I love you.";
char arr[20] = "I love you.";
static char sch = 'a';
char ch = 'a';
printf("str = %p\n", str); //静态存储区
printf("arr = %p\n", arr); //动态存储区
printf("&sch = %p\n", &sch); //静态存储区
printf("&ch = %p\n", &ch); //动态存储区
return 0;
}
运行结果如下,可看出str的地址格式和sch的一样,因为都是在静态存储区:
今天写这些是因为写了一个字符串反转函数,如下:
int reverse_pointer(char *str)
{
char tmp;
char *start = str;
char *end = str + strlen(str)-1;
if(NULL != str)
{
while(start < end)
{
tmp = *start;
*start++ = *end;
*end-- = tmp;
}
}
else
return -1;
return 0;
}
这个函数是没错的,但我一开始在main里面用char *str = “I love you.”;然后再把str传进去,这样做相当于试图修改存放在静态存储区的内容,程序会segmation fault。
重新写了一个能反转字符串指针的函数,如下:
char *reverse_static(char *str)
{
char *new = (char *)malloc(strlen(str) + 1);
char *tmp = new;
char *end = str + strlen(str) - 1;
while(str <= end)
*tmp++ = *end--;
*tmp = '\0';
return new;
}