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

时间:2019-12-20 13:51:42

标签: c pointers pointer-arithmetic

我尝试使用二维字符数组存储字符串,然后我想使用函数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作为输入部分,那么效果很好。因此,我想了解a+ia[i]之间的区别以及为什么a+i无法投放作为strcmp的参数,但它可以在scanf中使用。

谢谢。

2 个答案:

答案 0 :(得分:2)

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

长答案:a[i]在语义级别上旨在访问数组 a 的元素 i 。这是通过在内存中找出 a 的开头的地址,然后向其添加元素大小的 i 倍来找到目标元素的位置来完成的。

除此之外,单独调用 a (数组名称)将解析为该数组的地址,从而解析为指针类型的表达式。此外,“指针算术”指出,当组合整数值和指针值时,增量是指针元素的大小。因此,例如,如果您将32位整数指向a=0x80000000,则a+1将是0x80000004

答案 1 :(得分:0)

a是一个char数组。 strcmp需要类型为const char *的参数。

a[i]解析为*(a+i),即ith元素,在您的情况下为char数组。所以你还好。

a+i是第ith个元素的指针。您应该尊重这一点,以获取元素:*(a+i)