Стоит отвечать, чтобы попытаться помочь понять переменные и указатели, я думаю.
Чтобы попытаться ответить. , , как можно проще. , , ПРИМЕЧАНИЕ №1: основная проблема/проблема в том, что ch и ch2 объявлены как одиночные переменные char. Они могут быть «a» или «b» или «\ n» или 0x20 или любой другой символ. Это НЕ массивы символов или указатели. У вас есть комментарий, где вы читаете один char 'ch = getchar() // получая строку текста', этот комментарий неверен (хотя у вас есть хорошие комментарии, показывающие, что вы думаете в вашем примере), во всяком случае, ch = getchar() 'просто получает один символ. Позже вы рассматриваете ch2 как массив.
char ch,ch2;
. . . then later:
if (ch == ch2[&i]) { // ouch, does that even compile? yes. oh dear. how do we explain this one?!
ouch! Это неправильно, потому что он рассматривает ch2 как массив/указатель. То, как работает ваш цикл, теперь ch2 устанавливается на самый первый символ. И это никогда не меняется.
Он может скомпилировать все в порядке, НО это дает предупреждение? На самом деле, справедливо для вас. Я не получаю предупреждение. gcc 4.8.2 совершенно доволен тем, что ch2 является символом char и делает (ch == ch2 [& i]). Теперь ch2 [& i] может быть синтаксически корректным кодом, он будет компилироваться в порядке. Он даже будет работать нормально. Но что это значит? Это семантически допустимо? Давайте забудем об этой странной вещи до самого конца.
Обратите внимание, что вы можете скомпилировать c, но это может быть довольно много ошибок указателя и может привести к сбою/зависанию. Так . , , быть осторожен :-).
Попробуйте сделать изменения, как это:
ch = getchar(); // does not get the line of text, just gets one char
. . .
ch2 = 0; // for the first iteration of loop
if (ch == ch2) { // change from ch2[&i] - wow :-) very confused!
. . .
ch2 = ch; // set ch2 to the last char read before reading new
ch = getchar(); // read one new char
Это делает работу кода только с помощью 2 символов. ch и ch2. Вы не используете i. Вы не используете указатель массива или строки или указателя.
ПРИМЕЧАНИЕ # 1.1: ch2 [& i] компилируется и запускается. НО ЭТО НЕПРАВИЛЬНО, OHHHH SOOOOOO НЕПРАВИЛЬНО. И странно.Как работает доступ к массиву в c? Синтаксис c [& i] является «правильным» (возможно, зависит от компилятора). НО, пожалуйста, не используйте этот синтаксис! Что это значит? Это семантически сомнительно. Похоже, возможно, намерение состояло в том, чтобы использовать массив символов вместе с i. Быстрый пример, показывающий, назначая и чтение из символьного массива правильно:
char s[100]; // string of 100 chars, accessing index below 0 and above 99 is bad
i=0;
s[i]='H'; // assign char 'H' to first letter of string (s[0])
i++; // increment i, i is now 2.
s[i]='i';
i++;
s[i]=0; // end string
printf("s[0]=%c s[1]=%c s[2]=%02x string:%s",s[0],s[1],s[2],s);
Примечание # 1.2: ch2 [& я] компилируется и работает. Как и зачем он компилируется?
& я означает указатель на переменную я в памяти
% р в Printf будет показывать значение указателя
Так попробуйте добавить это пример кода:
printf("%p %p %p\n", &ch, &ch2, &i);
// ch2[i] will not compile for me, as ch2 is not an array. syntax error
// ch2[&i] DOES compile for me. But . . what is the value ?
// What does it mean. I do not know! Uncharted territory.
printf("ch2[&i]:%p:%02x\n",&i,ch2[&i]);
printf("ch2[&ch]:%p:%02x\n",&ch,ch2[&ch]);
printf("ch2[&ch2]:%p:%02x\n",&ch2,ch2[&ch2]);
Я получая что-то подобное, каждый из них меняет указатели:
ch2[&i]:0xbfa0c54c:bfa0de71
ch2[&ch]:0xbfa0c54a:08
ch2[&ch2]:0xbfa0c54b:00
Открытое объяснение:
Обычно мы объявляем массив, например. 'int array [100];' где 100 - размер массива. array [0] - это первый элемент, а массив [99] - последний. Мы индексируем массив с помощью целого числа. Теперь все массивы являются указателями. SO * массив совпадает с массивом [0]. * (массив + 1) совпадает с массивом [1].
Пока все хорошо.
Теперь * (1 + массив) также совпадает с массивом [1]. Можно сказать, что int i = 7; И используйте массив [i] или * (массив + 7) или * (7 + array) OR i [array], чтобы показать 7-й элемент массива. i [массив] любому программисту должен выглядеть очень ОЧЕНЬ WROOOONG (не синтаксически неправильно, НО философски/семантически/морально неправильно!)
Хорошо. Хорошо. Успокойся. Jeez. Теперь с 'char ch2;' ch2 - это один символ. Это НЕ массив. ch2 [& i] работает (работает как в компиляции, так и иногда/в основном работает нормально !!!), потому что последняя (WROOOONG) i [array] нотация действительна. Глядя на ВИДОВ интересно:
i[array] === <type int>[<type int *>].
ch2[&i] === <type char>[<type int *>].
C счастливо и весело бросает символ в целое и INT может быть добавлен указатель или использовать в качестве указателя. ИСКЛЮЧИТЕЛЬНО В ЗАКЛЮЧЕНИИ: синтаксис ch2 [& i] оценивает целое число при смещении: & i (указатель на целое число i) значение PLUS символа ch2. Нет никакой веской причины использовать этот синтаксис! Это опасно. Вы получаете доступ к ячейке памяти, которая может быть или не быть действительной, и поскольку ваш указатель указывает на одну переменную, местоположение недействительно в отношении любых других значений.
Смотрите здесь: Why 'c[&i]' compiles while 'c[i]' doesn't?
ПРИМЕЧАНИЕ # 2: смотреть брекет {}. а главное закрытие} и отступ не совпадают в примере. Программа работает нормально с этой ошибкой. Путчар (ch) работает как часть последнего. Команды после этого запуска в конце цикла while.
ПРИМЕЧАНИЕ # 3 main должно возвращать int не пусто main необязательно не принимает ничего '()' или '(int argc, char ** argv)'.
'ch2 [& i]' это неправильно во многих отношениях, либо 'ch2' не является массивом, ни' & i' действительным индексом. ('& i' - указатель, адрес памяти переменной' i'). Если 'ch2 = ch' сразу после' getch() 'call, и вы сравниваете их после, они всегда будут одинаковыми. –
Подумайте о том, как инициализировать 'ch2', чтобы вы не выполнили тест' if (ch == ch2) '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' (обратите внимание на мое тестовое предложение) –
@BenceKaulics, но он компилируется чисто ... 'ch2 [& i]' используется так, как будто это 'i [ch2]', что, конечно же, не так. –