字符串文字如何用于获取字符本身

时间:2014-02-22 13:17:12

标签: c string

我对以下内容感到困惑,请描述以下内容如何工作

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

它产生了y,但它是如何可能的?

5 个答案:

答案 0 :(得分:2)

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的工作原理。

答案 1 :(得分:1)

索引从0开始。

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

Structure of array

详细了解数组here

答案 2 :(得分:1)

你甚至不必写所有内容,你只能写,例如:

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

你会看到8被打印出来。其原因可以认为如下:

每当你的程序遇到双引号内的任何内容时,即"0123456789",计算机会分配一些内存,足以容纳这些新数据,并使用这些新数据填充内存。

在这种情况下,它会分配一块10 + 1(字符串终止为零)字节长的内存,填充它们像:

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

之后,它会抓取第一个元素的内存位置,并将其返回给您。在这种情况下,'0'的内存位置将返回给您。您也可以将其称为指针,您也可以将此数据集称为数组

现在,如果您要使用[0]附加数组名称( 第一个元素的内存位置),或者使用{{1添加前缀> }}?它会返回它中的第一个元素,对吧?如上所述,*计算第一个元素的内存位置,所以从逻辑上讲,"0123456789"也为你提供了第一个元素。其余元素相同......

答案 3 :(得分:0)

"bayant"[2]中,"bayant"会给出其基地址,这意味着它可以被视为const char *变量,所以

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

换句话说,"bayant"[2]或多或少等于

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

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

答案 4 :(得分:0)

字符串文字类似于字符串的基地址。所以,如果你想索引 "bayant"[2]它与ch[2]类似,只不过是“y”。

这是因为字符串文字是一个常量地址,所以它类似于使用指针*(ch + 2)访问数组内容。