180111—【字符】字符變量、字符數組以及它和指針亂七八糟的關係。

字符變量

賦值:
首先需要明白,char型變量存放的是一個ASCII碼值,是個數,但又不是個數。啥意思呢?
我們都知道在程序裏給一個char變量賦值的話,以下寫法是教科書級的:

char a=‘c’; //定義了一個char型變量a,它的值表示小寫字母“c”。

但由其實質出發的話,我們可以發現,這裏的賦值可以不寫成‘ c’這樣的形式:
這裏寫圖片描述
上述代碼中,變量b的賦值是直接用了數字,即ASCII碼值,可以見到,b的值是個括號。查碼值表可以發現“{”的值是123。
而對於c,其實char型變量的含義是“字符型變量”,這就意味着他不止可以存字母啊,各類符號都可以存啊~
既然存字母需要單引號,那存數字也要有單引號啊~
那爲什麼123變成3了?
其實這個語句系統會報警告:

[Warning] overflow in implicit constant conversion [-Woverflow]
[警告]隱式常數溢出
[Warning] multi-character character constant [-Wmultichar]
[警告]多字符常量

實測發現,放一位數是沒問題的,位數再多就會如此,數據溢出了,所以只讀到了最後一位的3(不是大小的事,寫00也會報)
這個錯誤其實在賦字母的時候也會出現:

char a='ab';    //a存住的東西只有b

綜上,在代碼中爲char型數據賦值基本上是在“論單引號的哲學意義和三重根”。。
好了不扯,
那麼如果寫成輸入語句,在黑框裏輸入內容又會如何呢?

你感覺呢?

當然直接輸就行了啊。當然不用輸單引號啊,不然是不是太不人道了點?
至於它的輸出,無甚可談。

下面是重頭戲啦~:

字符數組,以及指針。。

“C++沒有把字符串作爲基本類型,字符串常量是用雙引號相括的字符序列,以數組形式存放。”
先講數組:
首先,字符數組有如下幾種初始化方式。

1.通過大括號,逐個字符對數組元素賦初始值:

    char b[]={'s','t'};
    char c[10]={'s','t'}; 

上述兩種表示體現出char數組依舊具備之前剛接觸存int數據的數組時的初始化特性。

2.可以使用串常量初始化:

char a[]={"student"};
char a[]="student";

上述兩種表達都是一種原理。且這樣的初始化方式只能在定義字符數組之處使用,如果先定義。後賦值,則將報錯:

[Error] invalid conversion from 'const char*' to 'char' [-fpermissive]
[錯誤]無效的 常字符指針(也就是字符串)轉換爲字符。

3.黑框輸入:

其實很多時候我們需要這樣的功能,其實現也很簡單。定義一個長度足夠的字符數組,然後將輸入語句寫成:

char s[100];
cin>>s;  //直接寫名字就好。

這裏只整理簡單用法,至於爲了獲得空格需要的輸入函數暫且不涉及。

4.作爲函數待傳值參數:

使用字符串拷貝函數即可輕鬆做到。

#include<iostream>
#include<cstring>
using namespace std;
void a(char*num) //數組名和地址和指針的繞口令我就不念了。。
{
    char a_num[20];
    strcpy(a_num,num);
    cout<<a_num;
}
int main()
{
    a("dasdasf");  //這部分代碼實現需要指針的相關知識,後面會講
 } 

關於輸出:

對於一個int類型的數組,如果現在討論它的輸出的話,怕是要被人笑死。。
要是char型數組也這麼單純該多麼好。。可惜不是。
這裏寫圖片描述

  • 就像寫輸入語句的時候寫個首地址 a 就好了,輸出的時候也可以用這招。(其實應該說:就該用這招,別整些花裏胡哨的。而所謂花裏胡哨的是指:你當然可以像輸出普通數組所有元素一樣寫個for循環!
  • 如果是寫成 *a 用之前學數組時的知識分析,a即爲a[0]的地址,加星號實現了間址訪問。所以只輸出第一項。(如果想單獨輸出某個字母的話可以用這招。)就像寫成 a[0] 一般。
  • 其實我之前也沒想過取地址的地址會發生什麼。。
  • 第5個寫法完全是意外發現。取了首項的地址,於是輸出了整個串?(存疑)

另外,第一種和第五種都可以通過首地址加數而實現從某項開始輸出:
這裏寫圖片描述

  • a+1:則從第二個字母 t 開始輸出。

  • a[2]:則從第三個字母 u 開始輸出。

下面來說指針。
“將字符指針作爲串地址,爲管理字符串提供了方便”

    char *p="student";

要記住,p只是個普通的字符指針,不是數組,所以不能用初始化字符數組的方式(上文第一種)來初始指針,那就錯到家了。。
實際上,字符串在系統中是作爲“串常量”存貯在常量區的(當然,也有自己的地址)。所以按理來講,只有常指針可以指向它,用普通字符指針指向它會報錯。

[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
[警告]不被贊成的將串常量轉變爲字符型指針的轉換(我在翻譯些什麼???)

而關於指針的輸出
這裏寫圖片描述
基本上和數組時類似:

  • 寫指針的名字“p”即可整串輸出。
  • 寫名字加星號就只能輸出首字母。
  • 取地址。。就取地址唄。。

怕自己瘋掉就沒有嘗試其他形式。這裏存的疑問我認爲是因爲對於內存分配問題並沒有研究過,對於一個字符串在內存裏的樣子也不是很理解。所以想完全解釋清楚也很無力。

次日編:
“C++沒有把字符串作爲基本類型,字符串常量是用雙引號相括的字符序列,以數組形式存放。”
這句話在教材裏出現在第一章,也就是作爲向初學者介紹C++大致體系思想的地方,或許可以用來解釋上述的問題、。。

P.S.:
這篇總結本來早該發的。但是上一次在完成了60%,因爲翻自己之前的文章找例子時發現了一個錯誤,遂改。那篇文章發出去之後,發現這個編輯器裏面空了。空。了。。草稿箱裏也沒存,就這麼完美的不見了。

後來明白了。當我打開之前那篇文章時,編輯器只有一個,於是覆蓋掉了正在碼的文。所以就。。沒了。。

所以現在再來寫好像稍微有點抓不住重點的意思。。如有不足,歡迎指正。以後我會繼續完善。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章