天天看點

劍指offer筆試題 · 常量字元串

每篇前言

作者:安然無虞

作者請求:由于部落客水準有限,難免會有錯誤和不準之處,我也非常渴望知道這些錯誤,懇請鐵汁批評斧正。

劍指offer筆試題 · 常量字元串

文章目錄

  • ​​每篇前言​​
  • ​​1.引入:字元指針​​
  • ​​2.劍指offer · 常量字元串面試題​​
  • ​​3.遇見安然遇見你,不負代碼不負卿。​​

1.引入:字元指針

在指針類型中我們知道有一種指針類型是char*,它有兩種使用方法:

一般使用:

#include<stdio.h>
 
 int main()
 {
      char ch = 'w';
      char* pc = &ch;
      *pc = 'a';
      printf("%c\n", ch);

      return 0;
 }      

這種使用方法比較簡單,我就不過多闡述了,看看下面這種使用方法:

#include<stdio.h>
 
 int main()
 {
      char* p = "abcdef";
      printf("%s\n", p);
      return 0;
 }      
  1. 注意上面的 abcdef 是常量字元串,存儲在記憶體的隻讀資料區(隻讀不可寫)
  2. 特别容易讓我們以為是把字元串 abcdef 放到字元指針 p 裡了,其實本質上是把字元串 abcdef 首字元的位址放到 p 中

是以下面代碼是有問題的:

#include<stdio.h>
 
 int main()
 {
      char* p = "abcdef";
      *p = 'w';//目的是将'a'改成'w'(bug)

      return 0;
 }      

上面的第6行代碼是錯誤的,因為常量字元串不可以修改,是以為避免上述錯誤,可将第5行代碼修改為:

const char* p = "abcdef";      

這樣的話就會避免上述錯誤。

2.劍指offer · 常量字元串面試題

面試題:

#include <stdio.h>

int main()
{
    char str1[] = "hello bit.";
    char str2[] = "hello bit.";
    char* str3 = "hello bit.";
    char* str4 = "hello bit.";
    if (str1 == str2)
        printf("str1 and str2 are same\n");
    else
        printf("str1 and str2 are not same\n");

    if (str3 == str4)
        printf("str3 and str4 are same\n");
    else
        printf("str3 and str4 are not same\n");

    return 0;
}      
劍指offer筆試題 · 常量字元串

解題思路:

  1. str1 和 str2 是兩個字元數組,數組的操作方式是将右邊的常量字元串拷貝到數組的空間中,是以它們是兩塊空間,隻是内容相同,而作為數組名,str1 和 str2 是數組首元素的位址,是以 str1 != str2
  2. str3 和 str4 是兩個字元指針,指向的是同一個常量字元串,而常量字元串存儲在單獨的一個記憶體區域(隻讀資料區),當幾個指針指向同一個常量字元串的時候,它們實際上會指向同一塊記憶體
劍指offer筆試題 · 常量字元串

3.遇見安然遇見你,不負代碼不負卿。

前段時間部落客狀态不好,沒有及時更新,後面就會慢慢提速咯,感謝大家的支援與陪伴。

繼續閱讀