c語言中字元陣列和字元指標的問題

2021-03-27 05:22:49 字數 4165 閱讀 9333

1樓:千鋒教育

在函式內 char陣列被定義成局

部變數,函式執行後會被系統給釋放掉。 但char*p 則是定義成乙個常量,程式執行完後才會釋放掉。所以在返回char p 時會返回亂碼,但 char*p 則可以全部顯示出來

當然 char 也可以定義成靜態變數 這樣就可以顯示出來了不如static char p="hello";

2樓:匿名使用者

指標本身沒什麼生存期,它指向的記憶體的內容才有生存期。

換成char *p="hello world"之後,之所以可以正常輸出「hello world」,我的理解是,編譯器在靜態儲存區申請了一段記憶體,就算getmemory返回了,這段內容依然有效,所以能正常輸出。

而char p="hello world",p指向的是棧,函式返回這段記憶體就會無效。

3樓:

贊同jzp1的分析,我再舉個jzp1說的不規範的使用方法,該返回一樣可以列印出字串:

char *getmemory(void)

int main(int argc, char* argv)

4樓:

是相等的,你這裡後面那個問題可以正常輸出是因為hello world是個字串常量,不再是儲存在棧記憶體裡面。

5樓:水閣公子

兩個字串被放在不同的區內,乙個在棧區,乙個在字串常量區,棧區的隨函式呼叫結束而消失,常量區,一般是跟這個程序的生命一致。

6樓:匿名使用者

函式也是個作用域,如果是棧儲存的,出了這個作用域,自然會釋放,不論是指標、陣列還是變數

7樓:匿名使用者

也許在函式返回時把函式中生成的陣列所占用的空間收回或者覆蓋了別的內容。

而僅僅是指標指向的位址可能不在棧上開闢,那麼即使函式中定義的指標被**了,該指標指向的位址也沒有**。你可以程式設計試試。那個p指標所在的位址肯定**了,但是p指標指向的位址可能沒有**或者**了沒有覆蓋它。

要麼是'\0'的問題,加個'\0'試試看。

c語言中十六進製制字元陣列轉化為字串

8樓:娛樂小八卦啊

**如下:

void bytetohexstr(const unsigned char* source, char* dest, int sourcelen)

return ;

}擴充套件資料

字串是一種非常重要的資料型別,但是c語言不存在顯式的字串型別,c語言中的字串都以字串常量的形式出現或儲存在字元陣列中。同時,c 語言提供了一系列庫函式來對操作字串,這些庫函式都包含在標頭檔案 string.h 中。

字串常量與指標關係密切,因為字串常量的值,實際上表示的是儲存這些字元的記憶體空間的位址,更準確地說是字串常量中第 1 個字元的位址,而不是這些字元本身。因此,在 c 語言中是不能直接進行字串賦值的(因為沒有字串型別嘛)。

在 c 語言中,常通過宣告乙個指向 char 型別的指標並將其初始化為乙個字串常量的方式來訪問乙個字串。

9樓:彭珂的課堂

c語言_012_十六進製制轉十進位制

10樓:擁雲莊主

可以直接用memcpy函式把yy往data1,data2裡面拷貝就行了。

但是,由於long型別占用超過2位元組,所以這裡會涉及到cpu位元組序的問題。

通常我們用的windows機器都是小端序的,所以,示例**如下:

#include

#include

//#include

//下面這個是自己寫的位元組序翻轉巨集

#define

>>24) +

(((m)&0x00ff0000)>>8) +

(((m)&0x0000ff00)<<8)+(((m)&0x000000ff)<<24))

int main(int argc, char *argv)

;unsigned long data1, data2;

memcpy(&data1, yy, 4);

memcpy(&data2, yy + 4, 4);

printf("0x%x, 0x%x\n", data1, data2);

//data1 = htonl(data1);//使用系統函式轉換位元組序

//data2 = htonl(data2);

data1 = convert_int4(data1);//使用自定義巨集轉換位元組序

data2 = convert_int4(data2);

printf("0x%x, 0x%x\n", data1, data2);

return 0;

}輸出:

可以看到,拷貝完成之後,位元組序和你想要的是反的,所以,要把它轉換成你想要的位元組序。

使用自定義的巨集比較方便,你也可以使用htonl函式來轉換,但是要包含#include 標頭檔案,編譯的時候如果報鏈結錯誤,還要新增鏈結庫。

11樓:二月的

不用自己寫那麼多**吧 ... c 庫有好用的函式 ...

char data1[ 512 ]= ;

char data2[ 512 ]= ;

char temp[ 52 ] = ;

for( int i = 0; i < 4 )for( int i = 4; i < 8 )修改了一下,itoa 用了安全版本,新增了第二個緩衝區大小引數

12樓:匿名使用者

byte array[3]=;

char c[16];

sprintf(c,"%02x%02x%02x",array[0],array[1],array[2]);

printf("%s",c);

關鍵就在printf的格式符%02x 表示輸出2位十六進製制數並在前面補0

13樓:衡陽落雁

你寫的好像是對的呀,可以這樣賦值

0x表明了它是十六進製制數

14樓:初吻給了煙

#define _crt_secure_no_warnings#include

int main()

;int i;

char s[20] = ;

for (i = 0; i < 6; i++)//s[12] = '\0';

printf("s is : %s \r\n",s);

getchar();}

c語言 字元指標和字元陣列的區別

15樓:御阪妹妹

首先第一點,非常重要的一點:指標和陣列是不同的兩個型別!

我們從可以從c語言標準文件中得知:

iso/iec 9899:1999 - programing language c

6.2.5 types

20 .

這說明了什麼是陣列型別

同樣在20 .

說明了什麼是指標型別。

在了解了兩種型別的基礎上,我們了解陣列和指標的區別:

陣列是一組相同型別物件的集合,指標是對乙個物件的引用。

它們在使用中表現出了一定的相同點,但不同點也是很多的:

1,陣列直接儲存物件,指標則是指向乙個物件。

2,陣列名不能被賦值,指標變數能。

3,sizeof乙個陣列,得到陣列的長度(位元組單位),sizeof乙個指標,相當於sizeof(void*)。(注意,不同目標平台指標長度可能不同,所以sizeof(void*)是最準確的回答)

4,(可能是考試內容,對於正確性就呵呵)指標是間接訪問,陣列是直接訪問。

如果你對c語言有深入學習的想法,務必去了解一下c語言的iso標準。

16樓:匿名使用者

字串指標變數本身是乙個變數,用於存放字串的首位址。而字串本身是存放在

以該首位址為首的一塊連續的記憶體空間中並以『\0』

作為串的結束。字元陣列是由於若干個數

組元素組成的,它可用來存放整個字串

char *p =「c language」;

char p=;

可以理解為:字元指標是字元陣列的退化

但是實際使用中,字串指標卻比字元陣列更好用

c語言中,關於字串長度與字元陣列長度的問題

c語言約定字串以 0 結尾,上述陣列末尾沒有 0 所以字串的長度無法確定。陣列長度指的是陣列的元素個數,字串長度是以 0 為標誌來確定的,舉個例子 char a 20 abc 陣列長度是20,而字串長度是3,隱含的 0 不算在字串長度中。char a 按陣列來說已經初始化了3個char型別,分配了3...

c語言中關於字元陣列的長度問題,C語言中關於字元陣列的長度問題

r 這是個字元陣列,系統只為它分配了3個位元組的空間,但是strlen只有遇到 0 才會返回 於是它會向後繼續進行,直到有 0 這其實是越界 或許沒有,可能訪問的是q 10 了.你可以這樣 printf s n r 來檢視下列印的資訊。在我的上面 tc 是 3 3 3 9 哎。strlen 是在st...

c語言字元指標變數,C語言裡為什麼字元指標變數指向的字串常量中的內容是不可取代的?

對於printf這個函式,有著一系列的格式符號 比如你說的 d s不同的格式,有著不同的引數型別要求 比如 s 要求對應引數必須是char 型的 你例子中的string就是這一型別 所以不會出錯 如果換成printf s string string為char 型,對應的格式是 c 而 d對應的是整型...