C 指向字符数组的指针的行为如何?

C 指向字符数组的指针的行为如何?,c,pointers,multidimensional-array,C,Pointers,Multidimensional Array,为了理解特定长度字符数组指针的工作原理,我有以下代码片段,以及以下示例代码 #include <stdio.h> int main(){ char sports[5][15] = { "cricket", "football", "hockey", "basketball" }; char (*sptr)[15] = sports; if ( spt

为了理解特定长度字符数组指针的工作原理,我有以下代码片段,以及以下示例代码

#include <stdio.h>
int main(){

    char sports[5][15] = {

            "cricket",
            "football",
            "hockey",
            "basketball"
    };

    char (*sptr)[15] = sports;

    if ( sptr+1 == sptr[1]){

        printf("oh no! what is this");
    }

    return 0;
}
#包括
int main(){
char sports[5][15]={
“板球”,
“足球”,
“曲棍球”,
“篮球”
};
char(*sptr)[15]=体育;
如果(sptr+1==sptr[1]){
printf(“哦,不!这是什么”);
}
返回0;
}

sptr+1
sptr[1]
如何相等?第一种方法是将存储在
sptr
中的地址增加1,第二种方法是在取消引用指针编译器时获取存储在
sptr+1
中的地址值

a[i] ==  *(a+i);
您可以使用printf语句验证这一点

printf("%p\n",sptr[1]);
printf("%p\n",sptr+1);

请参阅此

sptr
是指向
15
char
s数组的指针。用
sports
初始化后,
sptr
指向
sports
数组的第一个元素,即
“cricket”

sptr+1
是指向
sports
的第二个元素的指针,它是
“football”
sptr[1]
相当于
*(sptr+1)
,它是指向
“football”
的第一个元素的指针,即

sptr + 1 ==> &sports[1] 
sptr[1]  ==> &sports[1][0]   
因为,
sptr+1==sptr[1]
给出了
true


请注意,尽管
sptr+1
sptr[1]
具有相同的地址值,但它们的类型不同
sptr+1
属于
char(*)[15]
类型,
sptr[1]
属于
char*
类型

是的,伙计,这是我的问题,sptr[1]的意思是*(sptr+1),那么它如何等于(sptr+1)?你编辑了你的问题,但似乎你也对这个比较感到困惑。上述比较不等于
'c'='c'
。这是一个指针比较。但是*(sptr+1)怎么是指针呢?它应该是字符串足球的第二个元素的值,即f?在与此答案相关的答案中详细解释了这一点。阅读这个答案,如果你觉得有什么困难,我就在这里。我现在更明白了,但请解释一下第三个例外,当我们有字符串文字时,数组如何不衰减为指针。@Rouftantical;这里写的是“exception”吗?我的意思是说“exception”我不能让GCC(nor-Clang)不警告类型不匹配(符合任何C标准的编译器都必须警告,甚至传统的GCC也要警告)。你用的是哪种编译器?@mafso所以我用的是代码块,它是IDE,不是编译器。例如,Gcc、Clang、MSVC都是编译器。它的GNU Gcc是默认的,因此您会收到一条警告(甚至是一个错误,例如
-pedantic errors
-Werror
)。你为什么不发呢?你明白警告了吗?搜索警告?从技术上讲,这里显示的代码完全无效,甚至可能无法编译。(尽管给出的问题和答案仍然适用于例如
if((char*)(sptr+1)==(char*)sptr[1])
,这是具有明确语义的有效代码。)