c語言printf("xyz-123"+2)為什麼結果是z-123?
因為:
#include &
int main() {
char* str = "xyz-123";
// similar to: char array[] = { "x", "y", "z", "-", "1", "2", "3", " " }; char* str = array[0];
char* str2 = str + 2;
// similar to: char* str2 = array[2];
printf("%p: %s
", str, str);
printf("%p: %s
", str2, str2);
}
輸出:
0x10e62bf9e: xyz-123
0x10e62bfa0: z-123
&>_&<
要拼接字元串的話請另外分配空間然後要麼顯式拷貝要麼用&
里的strcat()。 1、printf是從首字母地址開始輸出一個字元串到 結束。
2、"xyz-123" 相當於一個指針,指向首字母的地址。
3、"xyz-123"+2 相當於P+2,等於把地址往後挪了兩位。首字母就成了z,從Z開始輸出,到 結束。
4、如果你看不懂3是怎麼操作的,你需要去補字元串和指針的知識。請先問是不是好嗎。你這句的輸出結果是y-123,而不可能是z-123。
因為這個代碼相當於:
const char array[] = {"x", "y", "z", "-", "1", "2", "3", " "};
const char *p = array + 2;
printf(p);
另外看有些答案直接說"xyz-123"類型是const char *或char *,小小糾正一下:
string literal的類型並不是const char *
C語言的規定是,字元串literal的類型是char [N],N是這個字面量佔用內存空間大小(含末尾 ),C++則規定是const char [N]
C++中可以直接用typeid看類型,C中可以有多個證明辦法,比如sizeof,或者:
int *p = "hello";
然後看編譯報警信息中對"hello"的類型描述
C 語言沒有字元串……說字元串是習慣叫法,寫雙引號是語法糖。稍微高級點的語言往往是有真正的字元串的。你的操作邏輯是真字元串的操作邏輯。
R大沒有在答案里說,事實上對指針進行加減只會加減指針類型大小的倍數,請看圖:此處可以看到只會輸出c,前兩個被位移移沒了。printf是一樣的
指針的問題嘍指針加加減減的日常
想使用+符號拼接字元串,請使用java(逃
本來是print字元串指針裡面的東西。但是你加了2,相當於把字元串指針後移了兩位。指針就指向了第三個字元,所以是相當於,從第三個字元開始print
你需要知道,C語言中字元串的本質是什麼。c語言認為,字元串是字元的指針。用%s輸出的意思就是,從這個指針指向的內存開始,逐個輸出字元,直到遇見 為止。所以,+2就是把原來的指針向後移動兩個char類型的空間。
C區得取關了,問啥的都有
指針加法啊……char型指針,+2走兩個格子,c語言最基本的東西通常C string實際操作取的是首字母的地址
printf會一直print到 ,即結束符
@皮拉夫大王 不回答你的問題。
介紹一本絕版的書給你。如果學習這本書你會更加深入理解C語言的指針。
這本書介紹的是Linux下的彙編語言。要安裝32位的linux系統來學習。
Downloads - Oracle VM VirtualBox 這是虛擬機。
Download Ubuntu Kylin 推薦一個流行的linux發行版本。
如果這本書學完,你會對計算機的一些基礎知識更理深入理解。
反正現在的人不想折騰,愛學不學拉倒。我只是路過介紹一本書而已。
這本書taobao可以找到影印本。比原書便宜一些。
編譯完成後, 「xyz-123」 這個字元串常量會被分配在.text段中(只讀段)。鏈接完成後,會分配一個地址。假設loader載入運行後的內存分布如下(該段是只讀的):
0x80001000 "x"
0x80001001 "y"
0x80001002 "z"
0x80001003 "-"
0x80001004 "1"
0x80001005 "2"
0x80001006 "3"
0x80001007 0
運行時,先將0x80001000壓入棧中,然後調用printf。
現在+2的話,則會把0x80001002壓入棧,再調用printf。
具體研究的話,可以用調試器,在這句上設個斷點,然後進到反彙編裡面調一下,看一看參數是如何傳遞的。不同的編譯器,不同的cpu都不太一樣。具體實現要結合使用的平台了。
因為"xyz-123"其實是一個const char*,這個相當於在操作字元串指針。
"xyz-123" 實質是 一個內容為 xyz-123 然後加上一個 0 結尾的二進位序列的開頭地址(相當於 第一個 字元 x 的地址)。。於是 "xyz-123"+2 內容就是 z 這個字元所處的位置。
所以所以。。。。。
printf接受的是字元串首位的char*指針,而不是整條字元串,指針加2就是往後移兩位。
"xyz-123」表示的是一個指針值,+2其實就是在這個指針向後移動兩位
指針向後挪兩位,所以xy就被幹掉了,沒指到顯示不出來
推薦閱讀:
※什麼時候用C而不用C++?
※C 語言中,a+=1 和 a=a+1、a++ 有區別嗎?
※郝斌的 C 語言教程怎麼樣?
※為什麼學c語言我只會寫計算程序?
※c語言中x*x和pow(x,2)哪個計算更快一點?