C语言 字符串和指针
用指針實現的字符串:
#include <stdio.h>int main(void){char *p = "vv";printf("p = \"%s\"\n", p);p = "cat";printf("p = \"%s\"\n", p);return 0; }運行結果:
用指針實現的數組 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];
#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; }
運行結果:
可以看出二維數組和指針數組雖然都能實現對多個字符串的儲存,但是其本質是完全不一樣的,一個是定義時就已經分配了儲存字符串的空間,而另一個只是定義了指向字符串的指針,本身并不具有儲存字符串的空間,需要現給其一個指向,才能將字符串儲存到相應的位置,指針也要占用一定的內存空間。
總結
以上是生活随笔為你收集整理的C语言 字符串和指针的全部內容,希望文章能夠幫你解決所遇到的問題。