|
10.11.2010, 18:35
|
#1
|
Задрот
Регистрация: 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
|
Бывалый
Регистрация: 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
|
|
Ответ: Язык С - указатели
в данной ситуации для понимания спасает 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 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
11.11.2010, 01:19
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Язык С - указатели
Чтобы проще понять указатели с массивами, приведи аналогию:
Есть простая переменная, и указатель на неё. Указатель ведёт на позицию в памяти, где хранится эта переменная, и имеет размер какой положено.
Массив же, например размерностью в 10, будет иметь 10 переменных поочерёдно, таким образом, чтобы получить второй эллемент, то это указатель на первый эллемент + сместить на размер данного вперёд, получим уже указатель на второй.
|
(Offline)
|
|
11.11.2010, 23:25
|
#5
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Язык С - указатели
Да, я это знал, мока. Только вот путался - надо было сделать некий массив, в котором по индексам хранились бы названия переменных - то бишь char[] - ы, а в функцию надо было передать адрес массива, т.е. его первого элемента, в общем, я запутался, но решение нашел , хоть и корявое - прямо в функции создл двумерный массив чаров, и при выходе возвратил его. Коряво, но работает
В будушем поизучаю, занятная область
ЗЫ столкнулся с новой проблемой - надо где-то нарыть функцию str_replace, в стд либах не нашел, можт кто знает, не??
|
(Offline)
|
|
12.11.2010, 00:11
|
#6
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Язык С - указатели
напиши сам.
__________________
|
(Offline)
|
|
12.11.2010, 00:22
|
#7
|
Мастер
Регистрация: 27.01.2008
Адрес: Россия, СКФО, ЧР, Грозный
Сообщений: 1,144
Написано 578 полезных сообщений (для 2,207 пользователей)
|
Ответ: Язык С - указатели
Google показывает, что str_replace связана с PHP.
|
(Offline)
|
|
12.11.2010, 00:41
|
#8
|
|
Ответ: Язык С - указатели
|
|
|
Сообщение было полезно следующим пользователям:
|
|
16.11.2010, 01:30
|
#9
|
Задрот
Регистрация: 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
|
Знающий
Регистрация: 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
Значения параметров точно такие?
|
(Offline)
|
|
16.11.2010, 13:49
|
#11
|
|
Ответ: Язык С - указатели
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
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Язык С - указатели
Не знаю в чем был косяк, сделал по другому.
В общем новая проблема - не пойму, как записать байт в файл.
Типа byte там нет
|
(Offline)
|
|
26.11.2010, 15:56
|
#13
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Язык С - указатели
Где там?
char
__________________
|
(Offline)
|
|
19.05.2011, 13:24
|
#14
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Язык С - указатели
Ага, я неправильно открывал, надо было fopen(file,"wb");
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:56.
|