forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Язык С - указатели (http://forum.boolean.name/showthread.php?t=13692)

Reizel 10.11.2010 18:35

Язык С - указатели
 
Что то я запутался...
char str[50]
str - это указатель на первый элемент массива, так???
если я делаю так:
char **str[50]
то это значит, что str - указывает на первый элемент массива указателей на массивы строк по 50 символов, так??
т.е. str[0] - это указатель на первый символ первой строки, так???
PS пожалуйста, попрошу без подъ***в в стиле кнайта и рисунков кирзовых сапогов :-D

Morganolla 10.11.2010 18:44

Ответ: Язык С - указатели
 
че то звездочек очень много... это задачка из учебника?
в любом случае это массив указателей на...

jimon 10.11.2010 19:16

Ответ: Язык С - указатели
 
в данной ситуации для понимания спасает 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);

в данном случае память уже надо руками освобождать

moka 11.11.2010 01:19

Ответ: Язык С - указатели
 
Чтобы проще понять указатели с массивами, приведи аналогию:
Есть простая переменная, и указатель на неё. Указатель ведёт на позицию в памяти, где хранится эта переменная, и имеет размер какой положено.
Массив же, например размерностью в 10, будет иметь 10 переменных поочерёдно, таким образом, чтобы получить второй эллемент, то это указатель на первый эллемент + сместить на размер данного вперёд, получим уже указатель на второй.

Reizel 11.11.2010 23:25

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

ЗЫ столкнулся с новой проблемой - надо где-то нарыть функцию str_replace, в стд либах не нашел, можт кто знает, не??

SBJoker 12.11.2010 00:11

Ответ: Язык С - указатели
 
напиши сам.

Hurrit 12.11.2010 00:22

Ответ: Язык С - указатели
 
Google показывает, что str_replace связана с PHP.

jimon 12.11.2010 00:41

Ответ: Язык С - указатели
 
в STL есть : http://www.cplusplus.com/reference/s...tring/replace/

Reizel 16.11.2010 01:30

Ответ: Язык С - указатели
 
Эх, щас уже понимаю что это все фигня :-D
в общем, дело такое. мб это баг.
Имею строку 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 пишется ноль???
ЗЫ причем, это только на конце строки такая хе**я, в середине|начале работает отлично

wolfhound512 16.11.2010 02:24

Ответ: Язык С - указатели
 
Код:

#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

Значения параметров точно такие?

jimon 16.11.2010 13:49

Ответ: Язык С - указатели
 
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);


Reizel 26.11.2010 15:48

Ответ: Язык С - указатели
 
Не знаю в чем был косяк, сделал по другому.
В общем новая проблема - не пойму, как записать байт в файл.
Типа byte там нет :(

.Squid 26.11.2010 15:56

Ответ: Язык С - указатели
 
Где там?
char

Reizel 19.05.2011 13:24

Ответ: Язык С - указатели
 
Ага, я неправильно открывал, надо было fopen(file,"wb");


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot