1樓:大熊哥哥
"xyz-123" 實質是乙個內容為 xyz-123 然後加上乙個 0 結尾的二進位制序列的開頭位址(相當於第乙個字元 x 的位址)。。於是 "xyz-123"+2 內容就是 z 這個字元所處的位置。
所以所以。。。。。
2樓:愛笑的逗逼
R大沒有在答案裡說,事實上對指標進行加減只會加減指標型別大小的倍數,請看圖:
此處可以看到只會輸出c,前兩個被位移移沒了。
printf是一樣的
3樓:灰太大
0x80001000 'x'
0x80001001 'y'
0x80001002 'z'
0x80001003 '-'
0x80001004 '1'
0x80001005 '2'
0x80001006 '3'
0x80001007 0
執行時,先將0x80001000壓入棧中,然後呼叫printf。
現在+2的話,則會把0x80001002壓入棧,再呼叫printf。
具體研究的話,可以用偵錯程式,在這句上設個斷點,然後進到反彙編裡面調一下,看一看引數是如何傳遞的。不同的編譯器,不同的cpu都不太一樣。具體實現要結合使用的平台了。
4樓:姚瑞
真相其實是這樣的:字串在C語言中的型別其實是字元陣列,既然是陣列,那麼在表示式中就會自動轉換成指向其首元素的指標(指標型別的值),那麼現在+2就是指標運算了。
5樓:噼噼啪啪粉兔子
printf在輸出前,先申請記憶體儲存「xyz-2」。
再進行此str首位址+2。
最後呼叫printf,按格式輸出str+2。
6樓:
傳給printf函式的引數實質是字串指標。
字串和數字加運算,返回新的指標,值就是字串首位址往後便宜n個位元組,此處n為2,於是往後偏移2位元組,首位址指向z。
7樓:李梓萌
你需要知道,C語言中字串的本質是什麼。c語言認為,字串是字元的指標。用%s輸出的意思就是,從這個指標指向的記憶體開始,逐個輸出字元,直到遇見\0為止。
所以,+2就是把原來的指標向後移動兩個char型別的空間。
8樓:lydhm
因為「blabla」這種用雙引號表示的東西,在c裡面是表示的是位址。型別是const char*,然後按照printf的邏輯。。。就變成了那樣。
9樓:James Swineson
C 語言沒有字串……說字串是習慣叫法,寫雙引號是語法糖。稍微高階點的語言往往是有真正的字串的。你的操作邏輯是真字串的操作邏輯。
10樓:小熊
1、printf是從首字母位址開始輸出乙個字串到\0結束。
2、"xyz-123" 相當於乙個指標,指向首字母的位址。
3、"xyz-123"+2 相當於P+2,等於把位址往後挪了兩位。首字母就成了z,從Z開始輸出,到\0結束。
4、如果你看不懂3是怎麼操作的,你需要去補字串和指標的知識。
11樓:
本來是print字串指標裡面的東西。但是你加了2,相當於把字串指標後移了兩位。指標就指向了第三個字元,所以是相當於,從第三個字元開始print
12樓:RednaxelaFX
因為:#include
intmain
(); char* str = &array[0];
char
*str2
=str+2
;// similar to: char* str2 = &array[2];
printf
("%p: %s\n"
,str
,str
);printf
("%p: %s\n"
,str2
,str2);}
輸出:0x10e62bf9e: xyz-1230x10e62bfa0: z-123
>_<要拼接字串的話請另外分配空間然後要麼顯式拷貝要麼用裡的strcat()。
C語言輸入123輸出321這個程式怎麼寫?
intserver int data return int n n?int n 0 NoneType include void function void intmain include using namespace std void function void intmain include i...
為學習C 打好C語言基礎,什麼算是C語言基礎?
懂得函式,懂得指標變數,懂得記憶體模型,懂得基本資料型別,懂得變數的生命週期,懂結構體,懂記憶體對齊。c基礎就那麼些,但是指標是真的爽。 leopard 先說結論,沒必要單獨去為了所謂的 基礎 去學習c語言。c 是c的超集,就像小學數學是高中數學的底子一樣。這句話本來沒錯,但是c 經過這麼多年的 發...
C語言可以幹些什麼?C語言主要涉及哪些IT領域?
runner time 一般人靠學C語言去工作比較難,但是學習C語言能幫你更深入地理解作業系統的底層,為進一步學習研究作業系統打下基礎。計算機學習是乙個系統性問題,不可偏廢。比如說光學程式語言但是不學數學,一定會遇到明顯的瓶頸。作業系統當然也是必然要深入的領域。而且很多語言的設計思路借鑑了C語言,可...