a+i 和 a[i] 有什么区别

What's the difference between a+i and a[i]

我尝试使用二维字符数组来存储字符串,然后我想使用函数strcmp来比较两个相邻的字符串。

这是代码,成功了。

#include<stdio.h>
#include<string.h>
int main()
{
    char a[20][20];
    for(int i=0;i<20;i++)
        scanf("%s",a[i]);//input
    for(int i=1;i<20;i++)
    {
        if(strcmp(a[i],a[i-1])>0)//compare
        {
            //do something here
        }
    }
    return 0;
}

当我尝试用a+i代替a[i]时,问题出现了。(我是指针的初学者,在我看来这两个表达式是相同的)

第二个代码如下

#include<stdio.h>
#include<string.h>
int main()
{
    char a[20][20];
    for(int i=0;i<20;i++)
        scanf("%s",a+i);//input
    for(int i=1;i<20;i++)
    {
        if(strcmp(a+i,a+i-1)>0)//compare
        {
            //do something here
        }
    }
    return 0;
}

编译器告诉我 if(strcmp(a+i,a+i-1)>0)//compare 行中有错误,并显示以下消息。

[Error] cannot convert 'char (*)[20]' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'

我对这个问题很困惑。但是,如果我只使用 a+i 作为输入部分,它会起作用 well.So 我想知道 a+ia[i] 之间的区别以及为什么 a+i 不能t 作为 strcmp 的参数,但它可以在 scanf.

中工作

谢谢。

简答:a[i] 解析为 *(a+i)。注意星号“*”。

长答案:在语义层面,a[i] 意味着访问数组 a 的元素 i。这是通过在内存中找出 a 的起始地址,然后将 i 乘以元素大小的地址添加到它来找到的目标元素的位置。

除此之外,单独调用 a(一个数组名)被解析为这个数组的地址,从而解析为一个指针类型的表达式。此外, "pointer arithmetics" 指出,当组合整数和指针值时,增量是指向元素的大小。因此,如果您指向 a=0x80000000 处的 32 位整数,a+1 将是 0x80000004.