0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

char *s和char s[]在內(nèi)存中是怎么存儲的?

學(xué)益得智能硬件 ? 來源:學(xué)益得智能硬件 ? 2023-02-13 09:45 ? 次閱讀

36b159da-a8bf-11ed-bfe3-dac502259ad0.png

這兩行代碼有什么區(qū)別? 從語法層面上講,上面的是指針,下面的是數(shù)組,但是想要搞清楚他們的區(qū)別,還得知道他們在內(nèi)存中怎么存儲的。

371e73bc-a8bf-11ed-bfe3-dac502259ad0.png

操作系統(tǒng)中,每個(gè)進(jìn)程在啟動的時(shí)候都會被分配一塊虛擬地址空間,這塊空間包含數(shù)據(jù)段、代碼段、堆、棧等等。

char*s="helloworld";
s 屬于棧空間,在 64 位系統(tǒng)中占 8 個(gè)字節(jié)。

"helloworld" 我們把它稱作字符串常量,存放在只讀數(shù)據(jù)區(qū)。

既然是只讀數(shù)據(jù),那么它一定不能修改。

所以這條語句涉及兩塊內(nèi)存,棧空間的指針指向只讀數(shù)據(jù)區(qū)。

377c58ec-a8bf-11ed-bfe3-dac502259ad0.png ?

s 指向字符h,如果s++,那么就指向字符e。

3795fc0c-a8bf-11ed-bfe3-dac502259ad0.png ?

但是因?yàn)?helloworld"是只讀數(shù)據(jù),所以 *s 不能修改,比如:
 *s = 'a';
運(yùn)行會出錯(cuò)。
char s[] = "helloworld";
s 是一個(gè)數(shù)組,"helloworld"用于初始化數(shù)組。 數(shù)組存放在??臻g,算上字符串后面的?,數(shù)組占 11 個(gè)字節(jié)。 既然是棧空間的數(shù)據(jù),我們就可以通過數(shù)組名去修改,比如:
s[0] = 'a';
就是把字符 h 改成了 a。 但是由于數(shù)組名是常指針,表示的是數(shù)組首元素的地址,所以數(shù)組名不好修改。
s++;
會在編譯的時(shí)候直接報(bào)錯(cuò)。 要說他們倆有什么聯(lián)系,指針可以用下標(biāo)去訪問,數(shù)組也可以當(dāng)作指針來使用。
char *s1 = "helloworld";
printf("%c
",s1[1]);


char s2[] = "helloworld";
printf("%c
", *(s2 + 1));



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    566

    瀏覽量

    20384
  • 虛擬地
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    5478

原文標(biāo)題:char *s 和 char s[] 的區(qū)別

文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    char是什么數(shù)據(jù)類型

    數(shù)據(jù)代碼char
    油潑辣子
    發(fā)布于 :2023年11月16日 16:58:00

    error: incompatible types when assigning to type ‘char[20]’ from type ‘char **’

    #include#include#if 1char *GetSrand(char s[][20],int len){int a = len;srand(time(0));return s
    發(fā)表于 07-07 17:46

    bit和int char基本認(rèn)識及區(qū)別

     bit和int char之類的差不多,只不過char=8位, bit=“1位而已”。都是變量,編譯器在編譯過程中分配地址。除非你指定,否則這個(gè)地址是隨機(jī)的。這個(gè)地址是整個(gè)可尋址空間,RAM+FLASH+擴(kuò)展空間。bit只有0和1兩種值,意義有點(diǎn)像Windows下VC
    發(fā)表于 08-06 08:00 ?11次下載
    bit和int <b class='flag-5'>char</b>基本認(rèn)識及區(qū)別

    char *和char數(shù)組的區(qū)別及內(nèi)核訪問用戶區(qū)

    abcd 和ABCD了,這是為什么?實(shí)際上,char *只是一個(gè)指,僅僅是一個(gè)unsigned long,那么我們看看pa1,內(nèi)存實(shí)際就8個(gè)字節(jié)(32位機(jī)器),兩個(gè)指針,一個(gè)4個(gè)字節(jié),我們傳入send
    發(fā)表于 04-02 14:36 ?3119次閱讀

    浮點(diǎn)數(shù)在內(nèi)存存儲

    浮點(diǎn)數(shù)在內(nèi)存存儲和整數(shù)不同,因?yàn)檎麛?shù)都可以轉(zhuǎn)換為一一對應(yīng)的二進(jìn)制數(shù)據(jù)。而浮點(diǎn)數(shù)的存儲是由符號位 (sign) + 指數(shù)位 (exponent) + 小數(shù)位 (fraction) 組
    的頭像 發(fā)表于 09-20 10:52 ?3935次閱讀
    浮點(diǎn)數(shù)<b class='flag-5'>在內(nèi)存</b><b class='flag-5'>中</b>的<b class='flag-5'>存儲</b>

    char 與unsigned char在嵌入式開發(fā)的區(qū)別

    嵌入式數(shù)據(jù)采集的最小單位為8bit或者8bit的倍數(shù),在嵌入式char buf[ ]指的就是字符串,也就是所謂的字符空間,轉(zhuǎn)換成ascii碼是有符號數(shù)unsigned char b
    發(fā)表于 11-03 10:06 ?9次下載
    <b class='flag-5'>char</b> 與unsigned <b class='flag-5'>char</b>在嵌入式開發(fā)<b class='flag-5'>中</b>的區(qū)別

    51單片機(jī) 對 char 反序列輸出,以及注意事項(xiàng)

    反序列輸出 意思是 比如數(shù)值 0xaa (二進(jìn)制 1010 1010),輸出為 0x55(二進(jìn)制 0101 0101).先上函數(shù)unsigned char Reverse(unsigned
    發(fā)表于 11-23 16:20 ?8次下載
    51單片機(jī) 對 <b class='flag-5'>char</b> 反序列輸出,以及注意事項(xiàng)

    MCU_C語言中 數(shù)組型指針 的應(yīng)用 -- char (*stringp)[]

    定義一個(gè)指向數(shù)組的指針stringpchar (*stringp)[];取得某個(gè)數(shù)組的地址 :char *dst = &string[10];指針指向該數(shù)組的某個(gè)位置:stringp = (char (*)[])dst;
    發(fā)表于 11-29 18:06 ?2次下載
    MCU_C語言中 數(shù)組型指針 的應(yīng)用 -- <b class='flag-5'>char</b> (*stringp)[]

    字符型char和整型int之間的關(guān)系

    )有符號的字符表示-128127,無符號字符表示0255。char相當(dāng)于signed char還是unsigned char取決于編譯器。字符型數(shù)據(jù)在內(nèi)存
    發(fā)表于 01-13 15:22 ?1次下載
    字符型<b class='flag-5'>char</b>和整型int之間的關(guān)系

    S71200:char和string的定義

    數(shù)據(jù)類型為 char (Character) 的變量長度為 8 bit 位,占用1個(gè) byte 的內(nèi)存。char 數(shù)據(jù)類型將單個(gè)字符存儲為 ASCII 編碼形式。
    的頭像 發(fā)表于 04-01 11:13 ?7244次閱讀

    char和string在西門子PLC的格式

    數(shù)據(jù)類型為 char (Character) 的變量長度為 8 bit 位,占用1個(gè) byte 的內(nèi)存。char 數(shù)據(jù)類型將單個(gè)字符存儲為 ASCII 編碼形式。
    的頭像 發(fā)表于 07-07 17:05 ?1.5w次閱讀

    char和string在西門子PLC的格式

    數(shù)據(jù)類型為 char (Character) 的變量長度為 8 bit 位,占用1個(gè) byte 的內(nèi)存char 數(shù)據(jù)類型將單個(gè)字符存儲為 ASCII 編碼形式。
    的頭像 發(fā)表于 07-21 09:10 ?8526次閱讀

    收發(fā)通信數(shù)據(jù)時(shí)應(yīng)統(tǒng)一用unsigned char類型

    我看有同事用char類型接收,語法上來說char默認(rèn)是signed char
    的頭像 發(fā)表于 05-25 11:39 ?1042次閱讀

    如何將QString轉(zhuǎn)成char

    注意的是,如果轉(zhuǎn)換類型是const char *盡管用data()不會出錯(cuò),會給你自動轉(zhuǎn)換,但是還是不建議,因?yàn)樯羁截惲艘环荩碚撋显黾恿?b class='flag-5'>內(nèi)存開銷,如果字符串長度小還好,一旦很長,這個(gè)開銷挺大,這是個(gè)好的編程
    的頭像 發(fā)表于 11-24 15:33 ?793次閱讀

    oracleto_char用法

    to_char是Oracle數(shù)據(jù)庫的一個(gè)函數(shù),用于將不同類型的數(shù)據(jù)轉(zhuǎn)換為字符類型。 to_char函數(shù)的基本語法: to_char(表達(dá)式,格式模型) 首先,to_
    的頭像 發(fā)表于 12-05 16:54 ?1828次閱讀