Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите разобраться с указателями 
:(
    Опции темы
stat007
Дата 5.11.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: -2
Всего: -4



Помогите разобраться с указателем!

у меня такой вопрос - если пишем:
 
Код

char*p;
char str[10}; 
p=&str[0];
cout<<p<<endl; 


я думал что в р будет записан адрес первого элемента массива и на экране будет соответственно нулевой элемент массива, а компилятор мне всё содержимое массива выдаёт, в чем я заблуждаюсь?

Вот полный текст программы:

Код

#include <iostream>
using namespace std;
int main()
{
     char str[5];
     for (int i=0;i<5;i++)
          cin>>str[i];
     
     char* p;
     p=&str[0];
     int j=0;
     do
     {
          cout<<p<<endl;
          p++;
          j++;
     }
     while (j<5);
     return 0;
}


Помогите плиз разобраться..


M
JackYF
Кнопка "Код" сверху. Пользуйся.


Это сообщение отредактировал(а) JackYF - 5.11.2008, 20:55
PM MAIL   Вверх
IKM2007
Дата 5.11.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Код

char str[10]="asdfghjkl"; 
cout<<str<<endl; //печатает массив
char*p=&str[0];//сдесь p ссылается на str, то есть str и p одно и тоже



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
mes
Дата 5.11.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(stat007 @  5.11.2008,  20:08 Найти цитируемый пост)
cout<<p; 

Вы забываете что Cpp типизированный язык, из этого следует что вышеуказаная строчка 
будет исполнена как cout<<(char*) p; то есть будет посылать в поток символы расположенные в памяти начиная с адреса указаного в p
до тех пор пока не встретится символ '\0';  т.е будет расматривать p как указатель на Си-строку. smile 


--------------------
PM MAIL WWW   Вверх
stat007
Дата 5.11.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: -2
Всего: -4



ну так а всё-таки как сделать так, что бы обратиться именно к 0-му эл. массива, и вывести допустим только символ а ??
PM MAIL   Вверх
IceSunrise
Дата 5.11.2008, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 3



и str и p - это указатели на первый элемент массива. Чтобы вывести его значение, разыменуйте указатель *str или *p.
PM MAIL   Вверх
mes
Дата 5.11.2008, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(IKM2007 @  5.11.2008,  20:19 Найти цитируемый пост)
char*p=&str[0];//сдесь p ссылается на str, то есть str и p одно и тоже

нет, если ссылается это не значит что одно и то же..
Вот Вам пример :
Код

#include <iostream>

void f (const char* ) { std::cout<< 1 <<std::endl;}
void f (char* )       { std::cout<< 2 <<std::endl;}

int main( int argc, char** argv )
{
    char str[]="asdfghjkl";
    const char *p = str;

    f(str);  // напечатает 2
    f(p);   // напечатает 1 , хотя p ссылается на str

    system ("pause");

    return 0;
}


Это сообщение отредактировал(а) mes - 5.11.2008, 20:37


--------------------
PM MAIL WWW   Вверх
stat007
Дата 5.11.2008, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: -2
Всего: -4



а всё-таки как это сделать, разоминовать в самой первой программе, которую я привёл?
напишите плиз правильный код!..

Это сообщение отредактировал(а) stat007 - 5.11.2008, 20:37
PM MAIL   Вверх
mes
Дата 5.11.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(stat007 @  5.11.2008,  20:33 Найти цитируемый пост)
а как это сделать? 

Код

    std::cout << *p  << *(p+6) <<std::endl; // напечает 0й и 6й символ строки на которую указывает p


Это сообщение отредактировал(а) mes - 5.11.2008, 20:41


--------------------
PM MAIL WWW   Вверх
IKM2007
Дата 5.11.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(mes @  5.11.2008,  20:32 Найти цитируемый пост)
нет, если ссылается это не значит что одно и то же..

Ну, различие может быть только в типах(const или нет). Или я не прав?


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
IceSunrise
Дата 5.11.2008, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 3



mes,  не совсем понял, что вы хотели показать своим примером:
Цитата

нет, если ссылается это не значит что одно и то же..
Вот Вам пример :

PM MAIL   Вверх
stat007
Дата 5.11.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: -2
Всего: -4



э.. вы немного отклонились от темы! помогите мне разобратья!!!...
PM MAIL   Вверх
IceSunrise
Дата 5.11.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 3



stat007, вам уже несколько раз ответили и даже код привели:
Код

std::cout << *p << std::endl;


Это строка выведет вам значение первого элемента массива.

Это сообщение отредактировал(а) IceSunrise - 5.11.2008, 21:44
PM MAIL   Вверх
stat007
Дата 5.11.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: -2
Всего: -4



но ведь он выводит все элементы массива! а мне нужно только 1...
PM MAIL   Вверх
yngwie19
Дата 5.11.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



stat007, 
Код


char *p = "Hello World";
cout<<*p<<endl;



p или p[0]- это адрес первого элемента массива, соответственно чтобы получить значение, которое хранится по этому адресу, его нужно разыменовать. Писать так : *p[0] нельзя, поэтому нужно писать так *p.

Это сообщение отредактировал(а) yngwie19 - 5.11.2008, 22:46
PM MAIL   Вверх
mes
Дата 5.11.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(stat007 @  5.11.2008,  22:31 Найти цитируемый пост)
но ведь он выводит все элементы массива! а мне нужно только 1... 

Вы уверены, что пробуете тот код, который Вам тут подказали ??
Сравните , пожалуйста, внимательно и Вы увидете что в том коде, который выводит у Вас строку не хватает одной маленькой звездочки  smile

Добавлено @ 22:55
Цитата(IKM2007 @  5.11.2008,  20:43 Найти цитируемый пост)
Ну, различие может быть только в типах(const или нет). Или я не прав? 

Цитата(IKM2007 @  5.11.2008,  20:19 Найти цитируемый пост)
char*p=&str[0];//сдесь p ссылается на str, то есть str и p одно и тоже

а как насчет такого примера ?
Код

    std::vector<char> str;
    str.push_back ('1');
    str.push_back ('2');
    str.push_back ('3');
    str.push_back ('\0');

    char * p = &str[0]; // p и str не одно и то же 

    std::cout << p << std::endl;
//    std::cout << str << std::endl; // при раскомментировании ошибка компиляции


P.S название str  выбрал специально для демонстрации 

Добавлено @ 22:59
Цитата(yngwie19 @  5.11.2008,  22:43 Найти цитируемый пост)
исать так : *p[0] нельзя, поэтому нужно писать так *p

точнее сказать для указателя p[n] это *(p+n),  (при n==0 можно записать просто *p )
где p это указатель, а n целочисленое значение.

Это сообщение отредактировал(а) mes - 5.11.2008, 23:00


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.