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)哪個計算更快一點?

TAG:C編程語言 | CC | C編程 |