簡體   English   中英

如何使用字符串文字本身獲取字符

[英]how string literal can be used to obtain a charcter in itself

我對以下內容感到困惑,請描述以下內容

char ch[10] = "bayant";
char c  =  "bayant"[2] ;
printf("%c",c);

它產生y,但怎么可能呢?

ch[2]

僅用於語法糖

*(ch + 2)

由於加法是可交換的,所以與

*(2 + ch)

當然,這與其他數組類型的含義相同。

例:

int array[5] = {1, 2, 3, 4, 5};
// syntactic sugar
printf("%i\n", 3[array]);
printf("%i\n", array[3]);
// for
printf("%i\n", *(array + 3));
printf("%i\n", *(3 + array));

在你的例子中

printf("%c\n",*( 2 + "bayant")); 
printf("%c\n", *("bayant" + 2));

我知道這可能會導致奇怪,但這就是C的工作方式。

索引從0開始。

"bayant"[0] //b
"bayant"[1] //a
"bayant"[2] //y
"bayant"[3] //a
"bayant"[4] //n
"bayant"[5] //t

數組的結構

在此處閱讀有關數組的更多信息。

您甚至不必編寫所有這些內容,而只能編寫,例如:

printf( "%c", "0123456789"[8] );

您將看到8被打印出來。 可以認為其原因如下:

每當您的程序在雙引號中遇到任何內容時,即"0123456789" ,計算機就會分配一些內存,足以容納此新數據,並用此新數據填充內存。

在這種情況下,它將分配一塊內存,該內存長度為10 +1(對於以零結尾的字符串為1)字節長,將其填充為:

'0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '\0'
 ^   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^
1st 2nd 3rd 4th 5th 6th  .   .   .   .  11th

之后,它將獲取第一個元素的內存位置,並將其返回給您。 在這種情況下, '0'的存儲位置將返回給您。 您可以將其稱為指針 ,也可以將此數據集稱為array

現在就如果你是用一個追加數組名(這第一個元素的內存位置)發生什么[0]或用一個前綴它* 它會返回您的第一個元素,對吧? 正如我上文所述, "0123456789"評估第一個元素的存儲位置,因此從邏輯上講, "0123456789"[0]也會為您提供其中的第一個元素。 其余元素相同...

"bayant"[2]"bayant"給出其基地址,這意味着可以將其視為const char *變量,因此

"bayant"[0] --> 'b'
"bayant"[1] --> 'a'
......

換句話說, "bayant"[2]等於

const char *cp = "bayant";
cp[2];

我知道它看起來很奇怪,但這是C語法的工作原理,其中一部分只是很奇怪。

字符串文字與字符串的基地址相似。 因此,如果您想要"bayant"[2]索引,則它與ch[2]相似,只是“ y”。

這是因為字符串文字是一個常量地址,所以它類似於使用指針*(ch + 2)訪問數組內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM