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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2012, 20:07   #1
zheka1
 
Регистрация: 18.04.2012
Сообщений: 4
По умолчанию Указатели на строки

Коллеги, всем доброго времени суток
Разбирался я со строками, точнее с указателями на них и обнаружил одну преинтереснейшую вещь
Дан код на С++:
Код:
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main(int) {
	cout << "Creating and inicializing \"pstar\"" << endl << endl;
	char * pstar[6] = {"Robert Redford", "Hapalong Cassidy", "Lassie", "Slim Pickens", "Boris Karloff", "Oliver Hardy"};

	cout << "Creating and inicializing \"ch\"" << endl << endl;
	char * ch = new char[10];
	*(ch + 0) = 'A';
	*(ch + 1) = 'B';
	*(ch + 2) = 'C';
	*(ch + 3) = 'D';
	*(ch + 4) = 'F';
	*(ch + 5) = 'G';
	*(ch + 6) = 'H';
	*(ch + 7) = 'I';
	*(ch + 8) = 'J';
	*(ch + 9) = 'K';
	*(ch + 10) = '\0';
	cout << "Address of \"ch\" is " << &ch << endl;
	cout << "Content of \"ch *\" is " << ch << endl << endl << endl;
	cout << "Going through each \"ch's\" element (address - content for this address):" << endl;
	for(int i = 0; i < 10; ++i) {
		cout << (&ch + i) << " - " << ch[i] << endl;
	}
	cout << endl;
	
	cout << "Next array" << endl;
	cout << "Address of \"pstar[0]\" is " << &pstar << endl;
	cout << "Content of \"pstar[0]\" is " << pstar[0] << endl << endl;
	cout << "Going through each \"pstar's\" element (address - content for this address):" << endl;
	for(int i = 0; i < (sizeof pstar / sizeof pstar[0]); ++i) {
		cout << (pstar + i) << " - " << *(pstar + i) << endl;
	}
	cout << endl << endl;
	cout << "Address \"pstar\" and address \"ch\" are equel? :" << endl << endl;
	cout << (&ch + 3) << " " << ch[3] << endl;
	cout << (&pstar + 0) << " " << pstar[0] << endl;
	return 0;
}
суть которого создание и инициализация масива указателей pstar
Код:
char * pstar[6] = {"Robert Redford", "Hapalong Cassidy", "Lassie", "Slim Pickens", "Boris Karloff", "Oliver Hardy"};
и создание и инициализация указателя на массив таким вот образом:
Код:
char * ch = new char[10];
	*(ch + 0) = 'A';
	*(ch + 1) = 'B';
	*(ch + 2) = 'C';
	*(ch + 3) = 'D';
	*(ch + 4) = 'F';
	*(ch + 5) = 'G';
	*(ch + 6) = 'H';
	*(ch + 7) = 'I';
	*(ch + 8) = 'J';
	*(ch + 9) = 'K';
	*(ch + 10) = '\0';
далее в цикле смотрим для обеих масивов указателей на сами эти указатели и разыименовываем каждый из них и наблюдается вот что:

Во втором массиве "ch" четвертый элемент хранит адрес 0x0012FF4C а по этому адресу находится символ "D"
и первый масив "pstar" начинается с того же самого адреса, т.е. 0x0012FF4C, но по этому же адресу содержится строка "Robert Redford", итог показан двумя последними выводами в консоле, т.е. по одному и тому же адресу, два разных содержимого.

Естественно такого быть не может, вопрос что здесь не так?

Последний раз редактировалось zheka1; 18.04.2012 в 20:15.
zheka1 вне форума Ответить с цитированием
Старый 18.04.2012, 22:22   #2
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

во первых у вас переполнение массива, а во вторых вы берете адрес указателя, а не адрес на то что он указывает.
microbit вне форума Ответить с цитированием
Старый 19.04.2012, 01:48   #3
zheka1
 
Регистрация: 18.04.2012
Сообщений: 4
По умолчанию

Цитата:
во вторых вы берете адрес указателя, а не адрес на то что он указывает
спасибо за ответ
а как из указателя на char получить адрес, который в нем храниться?
т.е. имеется объявление и инициализация указателя на char
Код:
    char * pch = "abcd";
то операция
Код:
    cout << pch;
только отобразит содержимое abcde, т.е. разыменовывает
операция
Код:
    cout << &pch;
отобразит адрес самого указателя

А как посмотреть содержимое указателя, т.е. адрес куда он указывает, не используя отладчик?

Последний раз редактировалось zheka1; 19.04.2012 в 01:52.
zheka1 вне форума Ответить с цитированием
Старый 19.04.2012, 01:55   #4
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

Код:
cout<<(void*)pch;
microbit вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строки, указатели и DLL farique Microsoft Office Excel 0 30.08.2011 10:26
Указатели и строки(С) Alina_Honey Помощь студентам 0 03.06.2011 02:04
С++ Строки + указатели S1av0k Помощь студентам 4 03.12.2010 20:43
Строки и указатели........ karazmik Общие вопросы C/C++ 1 26.12.2009 01:16
Указатели на строки koljakolja Общие вопросы C/C++ 2 17.10.2008 22:57