天天看點

C語言 字元串和指針

用指針實作的字元串:

#include <stdio.h>

int main(void){
  char *p = "vv";
  printf("p = \"%s\"\n", p);
  p = "cat";
  printf("p = \"%s\"\n", p);
  
  return 0;
}      

運作結果:

C語言 字元串和指針
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;
}      

運作結果:

C語言 字元串和指針

指針 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];

  1. str = {‘V’, ‘V’, ‘c’, ‘a’, ‘t’, ‘\0’};
  2. str = “VVcat”;
  3. 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;
}
      

運作結果: