我对以下内容感到困惑,请描述以下内容如何工作
char ch[10] = "bayant";
char c = "bayant"[2] ;
printf("%c",c);
它产生了y,但它是如何可能的?
答案 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
详细了解数组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)访问数组内容。