Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 10.11.2010, 18:35   #1
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Язык С - указатели

Что то я запутался...
char str[50]
str - это указатель на первый элемент массива, так???
если я делаю так:
char **str[50]
то это значит, что str - указывает на первый элемент массива указателей на массивы строк по 50 символов, так??
т.е. str[0] - это указатель на первый символ первой строки, так???
PS пожалуйста, попрошу без подъ***в в стиле кнайта и рисунков кирзовых сапогов
(Offline)
 
Ответить с цитированием
Старый 10.11.2010, 18:44   #2
Morganolla
Бывалый
 
Аватар для Morganolla
 
Регистрация: 03.12.2008
Адрес: наша раша
Сообщений: 762
Написано 129 полезных сообщений
(для 245 пользователей)
Ответ: Язык С - указатели

че то звездочек очень много... это задачка из учебника?
в любом случае это массив указателей на...
__________________
Reality Simulation Games
Core 2 Duo 2,8GHz, RAM 1Gb, ATI R5670 1Gb. WinXP 32
(Offline)
 
Ответить с цитированием
Старый 10.11.2010, 19:16   #3
jimon
 
Сообщений: n/a
Ответ: Язык С - указатели

в данной ситуации для понимания спасает typedef, тогда :
typedef char** temp_type;
temp_type str[50];
собственно имеем 50 элементов типа temp_type, а тип temp_type это указатель на указатель на символ

чтобы еще лучше понимать как работают статические массивы то можно записать так :
typedef char** temp_type;
temp_type foo[50];
temp_type * str = foo;
здесь мы видим что foo по-сути является таким же указателем как и str, и обладает такими же свойствами, просто запись foo[50] используется чтобы выделить память на месте, с таким же успехом в последнем коде можно написать str[10] и мы получим 10 элемент (в принципе выражение str[10] просто превращается в *(str + 10) или *(temp_type*)((char*)str + 10 * sizeof(temp_type)), те к указателю str просто добавляем 10 размеров элементов на которые он указывает, если не приводить к однобайтовому типу то это просто +10, а если приводить то это +10 умноженное на размер элемента)

аналогично можно память выделить динамически
typedef char** temp_type;
temp_type * str = (temp_type*)malloc(50 * sizeof(temp_type));
...
free(str);
в данном случае память уже надо руками освобождать
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
baton4ik (10.11.2010), Reizel (11.11.2010)
Старый 11.11.2010, 01:19   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Язык С - указатели

Чтобы проще понять указатели с массивами, приведи аналогию:
Есть простая переменная, и указатель на неё. Указатель ведёт на позицию в памяти, где хранится эта переменная, и имеет размер какой положено.
Массив же, например размерностью в 10, будет иметь 10 переменных поочерёдно, таким образом, чтобы получить второй эллемент, то это указатель на первый эллемент + сместить на размер данного вперёд, получим уже указатель на второй.
(Offline)
 
Ответить с цитированием
Старый 11.11.2010, 23:25   #5
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Язык С - указатели

Да, я это знал, мока. Только вот путался - надо было сделать некий массив, в котором по индексам хранились бы названия переменных - то бишь char[] - ы, а в функцию надо было передать адрес массива, т.е. его первого элемента, в общем, я запутался, но решение нашел , хоть и корявое - прямо в функции создл двумерный массив чаров, и при выходе возвратил его. Коряво, но работает
В будушем поизучаю, занятная область

ЗЫ столкнулся с новой проблемой - надо где-то нарыть функцию str_replace, в стд либах не нашел, можт кто знает, не??
(Offline)
 
Ответить с цитированием
Старый 12.11.2010, 00:11   #6
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Язык С - указатели

напиши сам.
__________________
(Offline)
 
Ответить с цитированием
Старый 12.11.2010, 00:22   #7
Hurrit
Мастер
 
Аватар для Hurrit
 
Регистрация: 27.01.2008
Адрес: Россия, СКФО, ЧР, Грозный
Сообщений: 1,144
Написано 578 полезных сообщений
(для 2,207 пользователей)
Ответ: Язык С - указатели

Google показывает, что str_replace связана с PHP.
(Offline)
 
Ответить с цитированием
Старый 12.11.2010, 00:41   #8
jimon
 
Сообщений: n/a
Ответ: Язык С - указатели

в STL есть : http://www.cplusplus.com/reference/s...tring/replace/
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Reizel (12.11.2010)
Старый 16.11.2010, 01:30   #9
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Язык С - указатели

Эх, щас уже понимаю что это все фигня
в общем, дело такое. мб это баг.
Имею строку a, такого содержания:
1=1
3-й символ, соответственно, ноль.
Код:

int n1=atoi(a+back);
int n2=atoi(a+k+1);
printf("[%s]\n",a+k+1);
printf("%d %d\n",n1,n2);

back в данном случае = 0, k = 1
Получаю: n1=1, n2=0(!)
При этом printf("[%s]\n",a+k+1); пишет на экран [1], что доказывает, что a[k+1], т.е. a[2] == "1"
Какого же дьявола в n2 пишется ноль???
ЗЫ причем, это только на конце строки такая хе**я, в середине|начале работает отлично
(Offline)
 
Ответить с цитированием
Старый 16.11.2010, 02:24   #10
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений
(для 299 пользователей)
Ответ: Язык С - указатели

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
	const char* a = "1=1";
	char back = 0;
	char k = 1;

	int n1 = atoi( a + back );
	int n2 = atoi( a + k + 1 );

	cout << n1 << endl;
	cout << n2 << endl;

	return 0;
}
Выводит:
1
1

Значения параметров точно такие?
__________________
GUI, GUIw512, AlbaLynx, Форум
(Offline)
 
Ответить с цитированием
Старый 16.11.2010, 13:49   #11
jimon
 
Сообщений: n/a
Ответ: Язык С - указатели

atoi работает не с одним символом, а со всей строкой, когда пишем atoi( a + back ) то он работает с "1=1", а когда пишем atoi( a + k + 1 ) то с "1"

правильнее сделать так :
const char * a = "1=1";
char back = 0;
char k = 1;

char temp[] = {0, 0}; // по-сути это временная строка, первый символ будет цифра из нашей строки, второй будет 0 - символ окончания строки в памяти
temp[0] = *(a + back);
int n1 = atoi(temp);

temp[0] = *(a + k + 1);
int n2 = atoi(temp);
 
Ответить с цитированием
Старый 26.11.2010, 15:48   #12
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Язык С - указатели

Не знаю в чем был косяк, сделал по другому.
В общем новая проблема - не пойму, как записать байт в файл.
Типа byte там нет
(Offline)
 
Ответить с цитированием
Старый 26.11.2010, 15:56   #13
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Язык С - указатели

Где там?
char
__________________

(Offline)
 
Ответить с цитированием
Старый 19.05.2011, 13:24   #14
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Язык С - указатели

Ага, я неправильно открывал, надо было fopen(file,"wb");
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 13:48.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com