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+i
和 a[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
.
我尝试使用二维字符数组来存储字符串,然后我想使用函数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+i
和 a[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
.