用指針實作的字元串:
#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;
}
運作結果: