gcc добавляет char * и char как необработанные указатели ("str" ​​+ 'c') - PullRequest
1 голос
/ 18 января 2012

По какой причине gcc добавляет char * (например, "STRING") и char (например, "C") в качестве указателей?

  const char *ccc = "Test1";
  const char t = 'T';
  const char *res = ccc + t;
  printf("%s, %p, %d, %p\n", res, ccc, t, res);

выходы

  , 0x8048d97, 84, 0x8048deb

Я имею в виду, вы можете указать на документацию, стандартные спецификации или статью? Могу ли я контролировать или отключить это поведение?

UPD: почему я спрашиваю и что неожиданно, так это

  CString() + 'c'

работает как

 (char*)CString() + (char)char_var

когда компилятор не может найти подходящий оператор +. Я подумал, может быть, отключить автоматическую конкатенацию и найти все такие места (в устаревшем коде). Но в основном я просто хотел найти точную документацию по поведению.

Ответы [ 3 ]

3 голосов
/ 18 января 2012

В ccc + t, t рассматривается как целое число.В итоге res указывает на ccc плюс 84 байта, где 84 - это код ASCII 'T'.

. Стоит отметить, что ccc + t работает исключительно с указателями,не касается фактической строки.Я говорю это в случае, если есть ожидание, что "Test" + 'T' может добавить символ к строке - это не так.

1 голос
/ 18 января 2012

C не имеет строк . C имеет массивы и указатели.

Вы должны думать о «строковой константе» "Test1" как синтаксический сахар для инициализатора массива { 'T', 'e', 's', 't', '1', 0x00 }.

C даже не имеет символов . C имеет маленькие (обычно восьмибитные) целые числа.

Вы должны думать о «символьной константе» 'T' как синтаксический сахар для числовой константы 0x54 (при условии ASCII).

Так что когда пишешь

const char *ccc = /* whatever */;
char t = /* whatever */;
const char *res = ccc + t;

вы добавляете небольшое положительное целое число к указателю. Не больше, не меньше.

Я бы посоветовал, как сделать то, что вы хотели сделать, но это было бы утомительно, многословно и отвлекало от сути дела. C ++ имеет приличный строковый класс в наши дни, вы, вероятно, будете счастливее, просто изучив это.

1 голос
/ 18 января 2012

Это называется арифметика указателя. Например, ptr + x эквивалентно &ptr[x].

...