Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2011, 19:35   #1
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию Работа с указателями

Здравствуйте. Пытаюсь понять как работают указатели, но пока не могу сообразить, проблема состоит вот в чем: читаю справочное руководство Бьярн Страустрап_Введение в C++ вот это:
Код:
char c1 = 'a';
char* p = &c1    // в p хранится адрес c1
char c2 = *p;    // c2 = 'a'
Вроде бы все понятно, но составил вот такой набросок:
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#include <windows.h>
char vvedite[256];
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{char word;
CharToOem("Введите строку:",vvedite);
cout << vvedite; cin >> word;
cin.get();
cout << &word <<endl;
char* iword = &word;
cout << *iword; // почему то здесь получаю только первую букву введенной строки
getch();
}

int strlen(char* p)
  {
      char q = *p;
      return q;
  }
//---------------------------------------------------------------------------
Пытаясь передать указатель *iword в функцию strlen(char* p) и возвращая его получаю цифру 4, а если просто вывожу cout << *iword; то первую букву строки ...
Вопросы: как через указатель получить всю строку? Каким образом можно передать указатель в функцию и в функции получить по этому указателю строку? Заранее спасибо!
P.S. я только начинаю изучать с++ просьба сильно не ругайтесь за бесполезный код. Возможно путаю термины, если так то пожалуйста поправьте.
Byurrer вне форума Ответить с цитированием
Старый 31.03.2011, 20:15   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

строки вообще лучше объявлять либо string, либо вот так...
Код:
#include <iostream>
#include <stdio>
#pragma hdrstop

using namespace std;

int main()
{
        const char* myString = "Hello World!"; // константная строка
        cout<<myString<<endl;
        // а ещё можно вывести вот так... 
        const char* p = myString; // указатель на первый символ константной строки
        while (*p)
        {
            cout<<*p++;
        }
        cout<<endl;
        system("pause");
        return 0;
}
И ещё. ЧТО ЭТО???

Код:
int strlen(char* p)
{
      char q = *p;
      return q;
}

Последний раз редактировалось _-Re@l-_; 31.03.2011 в 20:18.
_-Re@l-_ вне форума Ответить с цитированием
Старый 31.03.2011, 20:32   #3
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

В эту функцию мне нужно передать указатель на саму строку, а далее в этой функции получить из указателя эту строку, вот только не могу сообразить как.
_-Re@l-_ как я понял именно вот этот кусок кода выводит всю строку по указателю:
Код:
while (*p)
        {
            cout<<*p++;
        }
Так?
И еще не могу сообразить, вот тут ты пишешь:
Код:
 const char* myString = "Hello World!"; // константная строка
        cout<<myString<<endl;
char* myString - это указатель на саму строку или что?

Последний раз редактировалось Byurrer; 31.03.2011 в 20:47.
Byurrer вне форума Ответить с цитированием
Старый 31.03.2011, 21:31   #4
blacktener
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 78
По умолчанию массивы

че я могу сказать так это по моему проблема в том что тип чар это массивы символов. А значит надо с ними работать как с массивами. Если ты не хочешь мучаться с этим типом то используй тип стринг как посоветовал выше товарищ
blacktener вне форума Ответить с цитированием
Старый 31.03.2011, 21:48   #5
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

Вот как переделал, результат то что нужно, но результат проделанной работы не тот что хотелось бы ... так и не понял как передевать функции указатель:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
char vvedite[256];
//---------------------------------------------------------------------------
void print_word_by_pointer(char *p)
{cout << "Print word: ";
  while (*p)
      {cout << *p++;}
  cout <<endl;
}
#pragma argsused
int main(int argc, char* argv[])
{char word[256];  int len;
CharToOem("Введите слово:",vvedite);
        cout << vvedite; cin >> word; cin.get();
print_word_by_pointer(word);
len = strlen(word);
        cout << "len = " << len <<endl;
getch();
}

//---------------------------------------------------------------------------
blacktener надо будет попробовать тип стринг, но хотелось бы так же и с массивом разобратся.

Вот еще как переделал:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#include <windows.h>
//#include <string.h>
char vvedite[256];
//---------------------------------------------------------------------------
void print_word_by_pointer(string *p)
{cout << "Print word: " << *p <<endl;
}
#pragma argsused
int main(int argc, char* argv[])
{string word;  int len;
CharToOem("Введите слово:",vvedite);
        cout << vvedite; cin >> word; cin.get();
        cout << word << endl;
string *sw = &word;
cout << "sw = " << sw <<endl;
print_word_by_pointer(sw);
//len = strlen(word);
        //cout << "len = " << len <<endl;
getch();
}

//---------------------------------------------------------------------------
Вот это то что нужно было, слава Богу получилось! Но возник другой вопрос, как можно из введенной строки вычислить количество символов в ней?

Последний раз редактировалось Byurrer; 31.03.2011 в 22:02.
Byurrer вне форума Ответить с цитированием
Старый 01.04.2011, 11:56   #6
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

советчики блин, куда ему ещё в string лезть, оставьте парня в покое, пусть дрючится с charaми
если хочешь длину строки strlen(word.c_str());

а вообще строка - это массив символов с \0 в конце, значт char str[80]; например так. а у тебя char - это 1 символ вот он тебе и выдавал 1 символ.


если же ты используешь
char* str;
то это указатель на какую то область памяти а не полноценная строка, ты можешь только помещать с помощью = по нему информацию.
функции для работы с ним не будут работать. strcpy strcmp.. и тд
нужно выделять память для таких указателей
Код:
	char *str = new char[80];

	strcpy(str,"123123");

        delete[] str;

Последний раз редактировалось onewho; 01.04.2011 в 12:04.
onewho вне форума Ответить с цитированием
Старый 02.04.2011, 17:54   #7
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

onewho спасибо, попробую таким образом.
Byurrer вне форума Ответить с цитированием
Старый 02.04.2011, 18:20   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
char* myString - это указатель на саму строку или что?
const char* myString - это константная строка. const здесь нужно из-за отличия строки и массива: в общем-то, дело в том, что вы не знаете, где С++ хранит локальные строки, и не можете изменить ни их местоположение в памяти, ни вообще значение строки.
А вот это...
Код:
char* myArr;
Просто указатель на символ.
Ну а вот это....
Код:
char* myArr[10];
Массив указателей.


Цитата:
Но возник другой вопрос, как можно из введенной строки вычислить количество символов в ней?
Функция strlen() рулит.

Последний раз редактировалось _-Re@l-_; 02.04.2011 в 18:22.
_-Re@l-_ вне форума Ответить с цитированием
Старый 02.04.2011, 21:09   #9
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

_-Re@l-_ спасибо, понял, на счет длины строки - тупанул малость, на счет указателей стало более менее яснее, но всеж есть неясности ... думаю разберусь! Еще раз всем спасибо за помощь!
Byurrer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с указателями stas135642 Общие вопросы C/C++ 2 21.11.2010 15:05
Работа с указателями Masip Общие вопросы Delphi 2 12.06.2010 12:49
Работа с указателями (C) pixel_ Помощь студентам 1 28.08.2009 14:07
Работа с указателями Mango Помощь студентам 2 23.11.2008 10:33
Работа с указателями!!! HKBD Общие вопросы C/C++ 1 06.10.2008 07:52