Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
| |
Поправка 07.06.05 18:15 Число просмотров: 1847
Автор: amirul <Serge> Статус: The Elderman
|
> buf - это на самом деле указатель сам по себе. То бишь > char buf[100]; > это то же самое, что и > char *buf=(char *)(malloc(sizeof(char)*100));
buf может неявно приводиться к указателю на первый (в смысле нулевой) элемент, но массив и указатель это абсолютно разные вещи.
Например
char *pointer=(char *)(malloc(sizeof(char)*100));
char array[100];
assert(sizeof(pointer) == sizeof(array));
---
Вывалится в дебаггер при первой же возможности. В C++ можно доказать, что типы разные еще и при помощи typeid или dynamic_cast
> Второе замечание: i - переменная типа int. Я не помню > точно, но вроде как Си не умеет приводить указатели к > другим типам, отличных от указателей.
Опять таки неявно он может и не приведет, а явное приведение выполняется леХко.
> Что делать: писать собственную функцию поиска подстроки, > которая будет возвращать целое значение. Или искать > подобную библиотечную (но я про такие не слышал).
Ну человек явно указал библиотечную функцию поиска подстроки - strstr ее зовут
|
<beginners>
|
Запутался с указателями 07.06.05 16:37
Автор: Изучаю С Статус: Незарегистрированный пользователь
|
char *s;
char buf[100];
int i;
s=strstr(buf, "test");
Хочу в i получить смещение строки "test" в строке buf.
Почему не работает i=s-&buf?
Как сделать, чтобы работало?
|
|
Re 07.06.05 17:11
Автор: Heller <Heller> Статус: Elderman
|
> 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
|
> buf - это на самом деле указатель сам по себе. То бишь > char buf[100]; > это то же самое, что и > char *buf=(char *)(malloc(sizeof(char)*100));
buf может неявно приводиться к указателю на первый (в смысле нулевой) элемент, но массив и указатель это абсолютно разные вещи.
Например
char *pointer=(char *)(malloc(sizeof(char)*100));
char array[100];
assert(sizeof(pointer) == sizeof(array));
---
Вывалится в дебаггер при первой же возможности. В 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 *), а отсылка к [любому типу] некорректна, потому как арифметика указателей явно говорит, что в результате вычитания указателей получается не смещение в байтах, а количество элементов данного типа между этими указателями.
#include <stdio.h>
void
main() {
char *pc1 = (char *)123456, *pc2 = pc1 + 5;
int numchars = pc2 - pc1;
int *pi1 = (int *)123456, *pi2 = pi1 + 5;
int numints = pi2 - pi1;
printf("%d\n%d\n", numchars, numints);
}
---
Выдает
5
5
---
Хотя sizeof(int) == 4 на моей машине.
|
| | | |
Требую сатисфакции !!! 07.06.05 18:44
Автор: PS <PS> Статус: Elderman Отредактировано 07.06.05 18:48 Количество правок: 2
|
> > Ведь [любой тип]* - занимает 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) в дальнейшем. Я просто залепил это тупиковое ответвление
ЗЫ: Оружие для дуэли выбирает вызываемый. Я выбираю харькачки с жеваной бумагой :-)
|
|
|