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

问题描述 投票:1回答:1

我尝试使用二维字符数组存储字符串,然后我想使用函数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 (*)[30]' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'

我对这个问题感到很困惑。但是,如果我仅将a+i用作输入部分,那么我想知道a+ia[i]之间的区别,以及为什么a+i不能用作strcmp的参数,但是它可以在scanf中使用。

谢谢。

c pointers pointer-arithmetic
1个回答
0
投票

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

长答案:在语义级别上,a[i]用于访问数组a的元素i。在内部,这是通过找出a的起始地址在内存中,然后将元素大小乘以[[i倍以找到目标元素的位置来完成的。

此外,单独调用

a

(数组名)将解析为该数组的地址,从而解析为指针类型的表达式。此外,“指针算术”指出,当组合整数值和指针值时,增量是指针元素的大小。因此,例如,如果您将32位整数指向a=0x80000000,则a+1将为0x80000004
© www.soinside.com 2019 - 2024. All rights reserved.