2015-02-21 2 views
5

У меня есть следующий фрагмент кода в понимании работы указателя на массив символов определенной длины со следующим примером кода.Как ведет себя указатель на массив символов?

#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; 
} 

Как sptr+1 и sptr[1] могут быть равны? Как первое, одно средство для увеличения адреса, который хранится в sptr один и второй один означает, чтобы получить значение по адресу, хранящийся в sptr + 1.

+0

Я не могу заставить GCC (или Clang) не предупреждать о несоответствии типа (компилятор, соответствующий стандарту C, должен предупреждать и даже «gcc -traditional'). Какой компилятор вы использовали? – mafso

+0

@mafso Я использую блоки кода – YakRangi

+0

Это IDE, а не компилятор. Например, Gcc, Clang, MSVC являются компиляторами. – mafso

ответ

7

sptr является указателем на массив 15char с. После инициализации его sports, sptr указывает на первый элемент массива sports, который является "cricket".

sptr + 1 является указателем на второй элемент sports который является "football" и sptr[1] эквивалентно *(sptr + 1), который является указателем на первый элемент "football", то есть,

sptr + 1 ==> &sports[1] 
sptr[1] ==> &sports[1][0] 

pointer to an array and pointer to its first element are both equal in value Так, sptr+1 == sptr[1] дает true значение.

Обратите внимание, что хотя sptr+1 и sptr[1] имеют одинаковое значение адреса, их типы отличаются. sptr+1 имеет тип char (*)[15] и sptr[1] имеет тип char *.

+0

, но как * (sptr + 1) является указателем, это должно быть значение второго элемента строкового футбола, который является f? – YakRangi

+0

Объясняется подробно в ответном ответе с этим ответом. Прочтите этот ответ, и если вы найдете какие-либо трудности, я буду здесь. – haccks

+0

спасибо за вашу поддержку за то, что я здесь, спасибо человеку – YakRangi

1

Хотя разыменования указателя компилятор будет делать так,

a[i] == *(a+i); 

Вы можете убедиться в том, что с помощью оператора PRINTF.

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

см это link.

+0

yes man look this is my question sptr [1] означает * (sptr + 1), то как он равен (sptr + 1)? – YakRangi

+0

нет человека, его ничего нет в блоках кода – YakRangi

+1

Ну, вы отредактировали свой вопрос, но, похоже, вы тоже смущены этим сравнением. Вышеприведенное сравнение не равно ''c' == 'c''. Это сравнение указателей. – haccks