Это должно быть простым, но указатели на массивы char по-прежнему оставляют меня почесывать голову иногда. gcc жалуется, что «индексированное значение не является ни массивом, ни указателем» в строках 4 и 5, и «недопустимый аргумент типа« унарный »* на строках 8 и 11. Может ли кто-нибудь объяснить, что здесь происходит не так? Я изменил строки 4 и 5, чтобы разыграть указатель сначала, используя скобки, но все же не могу получить то, что хочу.C-указатель путаницы - указатель на массив символов
Это должно быть довольно простая функция:
1 void makesafestr (const char *unsafe, const char *safe)
2 {
3 int offset=0;
4 for (; (*safe)[offset] != "\0" ; offset++) {
5 switch ((*unsafe)[offset]) {
6 case "\n":
7 case "\r":
8 *safe[offset] = "~";
9 break;
10 default:
11 *safe[offset] = *unsafe[offset];
12 }
13 offset++;
14 }
}
И вот почему вам не нужно «*». Постфиксное выражение, за которым следует выражение в квадратных скобках [], является индексированным обозначением элемента объекта массива. Определение индексного оператора [] состоит в том, что E1 [E2] идентичен (* ((E1) + (E2))). Из-за правил преобразования, которые применим к двоичному оператору +, если E1 является объектом массива (эквивалентно указателю на начальный элемент объекта ), а E2 является целым числом, E1 [E2] обозначает E2-й Элемент E1 (с нуля). – Fred
Ничего себе, это сложно. Означает ли это, что указатель ВСЕГДА разыменован первым, а затем добавлен индекс?Я был обеспокоен тем, что компилятор может предположить, что это массив указателей, и используйте адрес «safe» plus [offset], а затем разыщите этот адрес. –
Нет. 'A [i]' эквивалентно '* (a + i)'; * result * of 'a + i' разыменовывается (IOW, смещение добавляется до разыменования). Если бы вы объявили 'safe' как' char (* safe) [] '(указатель на массив' char'), * then * вам нужно было бы разыменовать указатель перед применением индекса (и parens вокруг '* safe 'будет обязательным - подписчик имеет более высокий приоритет, чем разыменование, поэтому' * safe [i] 'будет анализироваться как' * (safe [i]) ', а не' (* safe) [i] ', что могло бы вызвать проблемы). –