用指针实现的字符串:
#include <stdio.h>
int main(void){
char *p = "vv";
printf("p = \"%s\"\n", p);
p = "cat";
printf("p = \"%s\"\n", p);
return 0;
}
运行结果:
char *p = "vv";
printf("p = \"%s\"\n", p);
用指针实现的数组 p:
p 是指向char型变量的指针变量,它的初始值为字符串字面量 “vv”。对字符串字面量进行判定,可以得到指向该字符串字面量第一个字符的指针。所以 p 被初始化为指向保存在内存中的字符串字面量“vv”的第一个字符串’v’的指针。
使用指针实现字符串的错误声明:
char * p = {'v', 'v', 'c', 'a', 't', '\0'};
数组用的{}形式的初始值,不可用于单一的变量。
在内存空间中,指针 p 和 字符串字面量 “vv” 双方都占据了内存空间。
#include <stdio.h>
int main(void){
char *p = "vv";
printf("p = \"%s\"\n", p);
printf("sizeof(p) = %u \n", sizeof(p));
printf("sizeof(\"vv\") = %u \n", sizeof("vv"));
return 0;
}
运行结果:
指针 p 占用的空间为 sizeof§,即 sizeof (char*)字节,其长度因编译器而异。
所以,用指针实现的字符串比用数组实现的字符串需要更多的内存空间。
char *p = "vv";
printf("p = \"%s\"\n", p);
p = "cat";
printf("p = \"%s\"\n", p);
用数组实现的字符串和用指针实现的字符串的不同的地方是:
可以为指向字符串字面量(中的字符)的指针赋上指向别的字符串字面量(中的字符)的指针。赋值后,指针指向新的字符串字面量(中的字符)。
注意:
p的中的字符串发生变化,并不是完全复制了字符串,在内存中指针的指向发生了变化,指针不再指向“vv”,“vv”不能被访问,在内存中变成了无法被清楚的垃圾。因为字符串字面量具有静态存储器,在不需要的情况下,不会自动被从内存空间清除。
#include <stdio.h>
int main(void){
char str[] = "2020";
printf("str = \"%s\"\n", str);
str = "07/08"; // 此赋值方式 在字符串数组中不可以使用,编译错误
printf("str = \"%s\"\n", str);
return 0;
}
字符串数组直接赋予数组变量,以下3种是错误的赋值方式:
char str[6];
- str = {‘V’, ‘V’, ‘c’, ‘a’, ‘t’, ‘\0’};
- str = “VVcat”;
- str = {“VVcat”};
#include <stdio.h>
#define LEN 6
int main(void){
int i ;
char a[][LEN] = {"2020", "7", "vvcat"};
char *p[] = {"2020", "7", "vvcat"};
for(i = 0; i < 3; i++){
printf("a[%d] = \"%s\", sizeof(a[%d]) = %u \n", i, a[i], i, sizeof(a[i]));
}
puts("---------------------------");
for(i = 0; i < 3; i++){
printf("p[%d] = \"%s\" sizeof(p[%d]) = %u \n", i ,p[i], i, sizeof(p[i]));
}
puts("---------------------------");
printf("sizeof(p) = %u \n", sizeof(p));
printf("sizeof(\"2020\") = %u \n", sizeof("2020"));
printf("sizeof(\"7\") = %u \n", sizeof("7"));
printf("sizeof(\"vvcat\") = %u \n", sizeof("vvcat"));
return 0;
}
运行结果:
可以看出二维数组和指针数组虽然都能实现对多个字符串的储存,但是其本质是完全不一样的,一个是定义时就已经分配了储存字符串的空间,而另一个只是定义了指向字符串的指针,本身并不具有储存字符串的空间,需要现给其一个指向,才能将字符串储存到相应的位置,指针也要占用一定的内存空间。