在C/C中使用计数器变量访问字符串++

在C/C中使用计数器变量访问字符串++,c,string,pointers,C,String,Pointers,可能重复: 在C++参考书中,我找到了一个访问字符串的例子: void main() { char *str = "Test"; int len, i; clrscr(); len = strlen(str); for(i=0 ; i<len ; i++) { printf("%c", i[str]); } getch(); } 我为什么工作?i是一个变量,而不是数组 如果字符串声明为str[]而不是

可能重复:

在C++参考书中,我找到了一个访问字符串的例子:

void main()
{
    char *str = "Test";
    int len, i;

    clrscr();

    len = strlen(str);
    for(i=0 ; i<len ; i++)
    {
        printf("%c", i[str]);
    }

    getch();
}
我为什么工作?i是一个变量,而不是数组

如果字符串声明为str[]而不是*str,它也可以工作。

它可以工作,因为在C中,str[str]和str[i]是等价的

i[str]和str[i]的计算方式与*str+i相同


声明str[]时,str是指向数组第一个元素的指针,Char指针指向字符串开头的内存位置,数组索引例如str[i]基本上是向字符串开头添加i次迭代

所以,str+i=str[i]=i[str]=i+str

使用这个内部printf,就像您正在做的一样,所有这些都将计算相同的值:

printf("%c", str[i]);
printf("%c", i[str]);
printf("%c", *(str+i));
printf("%c", *(i+str));

另请参见:

好的,概括一下,我们可以说常量[pointer]和指针[constant]是相同的吗?因为自由的理解会说str表示内存地址的某个十六进制值,这意味着i[str]实际上是常量[0x123213]???很好,这就解释了。据我所知,因为编译器知道在I和str中,str是指针。所以str指向的内存区域应该被访问,而不是i,即使我们在括号外写i?是的。编译器实质上是将这两个数字相加,无论采用哪种方式相加,都会得到相同的位置