C語言中char s 與char s的不同

2021-09-02 19:22:58 字數 1066 閱讀 8281

首先看一下c語言中下面兩個語句的不同:

char s[10] = 「abcde";

char *s = "abcde";

兩者不同的關鍵點如下:

(1)陣列

char s[10] = "abcde"

s是乙個陣列;

sizeof(s) = 10 bytes

a與&a是一樣的

abcde儲存在記憶體的棧空間中

char s[10] = "abcde";

s = "hello";這是非法的,因為a本身是乙個位址,字元常量」abcde「也是乙個位址

s++是非法的

char s[10] = "abcde";

a[0] = 'b';合法

(2)指標變數

char *s = "abcde"

s是乙個指標變數;

sizeof(s) = 4 bytes;//32位機器

s與&s不一樣

s儲存在棧空間中,但是abcde儲存在記憶體的唯讀區域中

char *s = "abcde";

s = "hello";合法

s++是合法的

char *s = "abcde";

a[0] = 'k';非法,"abcde"處在唯讀儲存區

對於char s = "abcde",雖然我們初始化了5個元素,但是它的size是6,因為編譯器會自動在末尾加'\0'。

#include

int main(void)

輸出:5,6

char *s = "asdad",建立乙個字串字面值,對於大部分編譯器來說,字串字面值儲存在記憶體的唯讀部分,修改它是非法的。s是儲存字串字面值的指標。

#include

int main() 

輸出:8

執行上面的程式有時候會遇到提示「warning: deprecated conversion from string constant to 『char*』",這是因為s不是乙個常量指標,但是儲存的確實唯讀區域的位址,可以修改為const char *s

基礎知識:

可以看一下這篇文章,寫的挺清楚的

C 函式引數 char s與char s

本文同時發表在 先來看乙個小例子 編寫函式遍歷乙個整型陣列的元素,陣列最後乙個元素為 1標誌陣列的結束。下面對題目進行一下公升級 編寫函式遍歷乙個指標陣列的元素,陣列最後乙個元素為null標誌陣列的結束。include void test char char s int main void test...

小結char s 與char s 的區別

char s1 hello char s2 hello 區別所在 char s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。char s2的s2 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡...

char s1 與 char s2 的區別

今天看到如下 char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout boolalpha str1 str2 endl 輸出什麼?...