> > Ведь [любой тип]* - занимает 4 байта, что полностью > мапится > > на переменую типа int.
> Твой пример работает только с (char *), а отсылка к [любому > типу] некорректна, потому как арифметика указателей явно > говорит, что в результате вычитания указателей получается > не смещение в байтах, а количество элементов данного типа > между этими указателями.
Обрати внимание, что я не сказал будто int* a = 0; a++; это тоже самое что и char* c=0; c++;
НЕ БЫЛО ТАКОГО! В строчке
> > Ведь [любой тип]* - занимает 4 байта, что полностью > мапится > > на переменую типа int.
говорится только о величине переменной в байтах, и о том, что указатель можно(!) хранить в int !
double* d; int a= d; d=a; - запись корректна!
Ты же говоришь о том, что
double* d;
int a = d;
a++;
d++;
дадут разные результаты.
Согласен, но об этом у меня не было НИ СЛОВА!
Так что стреляемся на ножах !!!! :)))
> char *s; > char buf[100]; > int i; > > s=strstr(buf, "test"); > > Хочу в i получить смещение строки "test" в строке buf. > Почему не работает i=s-&buf? > > Как сделать, чтобы работало? buf - это на самом деле указатель сам по себе. То бишь
char buf[100];
это то же самое, что и
char *buf=(char *)(malloc(sizeof(char)*100));
а
buf[0]
это тоже самое что и
*buf
Стало бы амперсанд перед buf лишний - ты получаешь указатель на указатель.
Второе замечание: i - переменная типа int. Я не помню точно, но вроде как Си не умеет приводить указатели к другим типам, отличных от указателей.
Что делать: писать собственную функцию поиска подстроки, которая будет возвращать целое значение. Или искать подобную библиотечную (но я про такие не слышал).
Поправка07.06.05 18:15 Автор: amirul <Serge> Статус: The Elderman
Вывалится в дебаггер при первой же возможности. В C++ можно доказать, что типы разные еще и при помощи typeid или dynamic_cast
> Второе замечание: i - переменная типа int. Я не помню > точно, но вроде как Си не умеет приводить указатели к > другим типам, отличных от указателей.
Опять таки неявно он может и не приведет, а явное приведение выполняется леХко.
> Что делать: писать собственную функцию поиска подстроки, > которая будет возвращать целое значение. Или искать > подобную библиотечную (но я про такие не слышал).
Ну человек явно указал библиотечную функцию поиска подстроки - strstr ее зовут
не путай ребенка :)07.06.05 17:30 Автор: PS <PS> Статус: Elderman
В С возможно любое приведение, иногда это порождает ТАКИЕ приведения, что проще переписать, чем на них охотиться :)
Но это лирика, а физика в том, что
int i;
char* S1;
char* S2;
i = S2 - S1;
Абсолютно валидно, без всяческих доп. усилий.
Ведь [любой тип]* - занимает 4 байта, что полностью мапится на переменую типа int.
Ну заодно и ты не путай ребенка :-)07.06.05 18:09 Автор: amirul <Serge> Статус: The Elderman
> В С возможно любое приведение, иногда это порождает ТАКИЕ > приведения, что проще переписать, чем на них охотиться :) > Но это лирика, а физика в том, что > int i; > char* S1; > char* S2; > i = S2 - S1; > Абсолютно валидно, без всяческих доп. усилий. > Ведь [любой тип]* - занимает 4 байта, что полностью мапится > на переменую типа int. Твой пример работает только с (char *), а отсылка к [любому типу] некорректна, потому как арифметика указателей явно говорит, что в результате вычитания указателей получается не смещение в байтах, а количество элементов данного типа между этими указателями.
> > Ведь [любой тип]* - занимает 4 байта, что полностью > мапится > > на переменую типа int.
> Твой пример работает только с (char *), а отсылка к [любому > типу] некорректна, потому как арифметика указателей явно > говорит, что в результате вычитания указателей получается > не смещение в байтах, а количество элементов данного типа > между этими указателями.
Обрати внимание, что я не сказал будто int* a = 0; a++; это тоже самое что и char* c=0; c++;
НЕ БЫЛО ТАКОГО! В строчке
> > Ведь [любой тип]* - занимает 4 байта, что полностью > мапится > > на переменую типа int.
говорится только о величине переменной в байтах, и о том, что указатель можно(!) хранить в int !
double* d; int a= d; d=a; - запись корректна!
Ты же говоришь о том, что
double* d;
int a = d;
a++;
d++;
дадут разные результаты.
Согласен, но об этом у меня не было НИ СЛОВА!
Так что стреляемся на ножах !!!! :)))
Да, формально ни единой ошибки не было08.06.05 12:23 Автор: amirul <Serge> Статус: The Elderman
Но стиль изложения все таки предполагал неверный ход мыслей (если предположить, что "ребенок" вообще не знает C) в дальнейшем. Я просто залепил это тупиковое ответвление
ЗЫ: Оружие для дуэли выбирает вызываемый. Я выбираю харькачки с жеваной бумагой :-)