Указатели

Oct 21, 2011 12:05

Окей, я честно всю ночь пыталась с этим разобраться.
Но почему-то мне очень хочется сказать, что это какая-то гребаная женская логика (да, я шовинистическая свинья!).
Серьезно, на несколько страниц гуглопоиска по разным ключевым словам - ничерта непонятно, плюс разный синтаксис везде.

[Внимание! Пост проапдейчен в связи с тем, что я разобралась с ( Read more... )

непонятные буковки, вышел из себя в открытый космос

Leave a comment

Comments 32

(The comment has been removed)

evilduckk October 21 2011, 11:27:38 UTC
Типы переменных - int и int * . Пока не разберусь, что на что указывает - мне сложно понять, что какого типа будет.

Вроде бы так логично все, спасибо!
Получается, что звездочки переносятся налево как амперсанды и наоборот вправо.
Но в разных источниках разное пишут. Например, что стандартное задание указателя - это *a=&b (int *a; int b).

Я верно понимаю, что массив - это набор указателей на несколько переменных?

struct1
{
...;
struct2
{
...;
int name;
}
}

А куда там указатели, я вообще не поняла, но в примерах они были.

Reply

(The comment has been removed)

evilduckk October 22 2011, 09:05:23 UTC
Уже разобрались с этим :)

Reply


norguhtar October 21 2011, 09:32:50 UTC

*a=&b - a указывает на значение b?

да

*a=b - a указывает на значение b?

нет указывает на ерунду.

*array[20] - указатель?

Насколько я помню работать не будет :]

array[20] - указатель?

Не совсем.

array - указатель?

Нет.

struct1.struct2.name - так нельзя?

Можно если структура объявлена не через указатель.

s2->name - так правильно?

Да.

PS А почему ви спрашиваете?

Reply

evilduckk October 21 2011, 11:11:03 UTC
Ми таки спрашиваем, потому что имеется лаба по С++, тема "Структуры". В примерах какие-то указатели, стрелочки, херня какая-то непонятная. Забиватор предлагает тоже как-то через указатели, а я вообще не понимаю, что это за хрень такая.

*a=b - а разве оно не указывает на значение по адресу b?

Про массивы пишут, что они работают как указатели. Но что это значит - я не поняла.

Reply

norguhtar October 21 2011, 11:21:37 UTC

*a=b - а разве оно не указывает на значение по адресу b?

неа.

a=&b - запишет в указатель адрес b.
*a=b - запишет значение b в ту область памяти куда указывает указатель a.

Массивы действительно работают как указатели. Фишка тут какая [] используются для осуществления смещения. Это смещение будет равно тому количеству байт которые занимает объявленный тип массива.

Собственно в указателях надо помнить ровно одну хрень. Указатель это такая переменная которая содержит адрес памяти и ничего больше. Операция * позволяет считать данные которые лежат по этому адресу памяти. И да, указатель ничего не знает что там такое лежит. Для лучшего понимания надо поиграться с malloc().

Reply

norguhtar October 21 2011, 11:23:04 UTC

*a=b - запишет значение b в ту область памяти куда указывает указатель a.

Кстати да. Запись большего объекта в меньший объем выделенной памяти будет приводить к segfault

Reply


stzozo October 21 2011, 09:34:28 UTC
Если слева от переменной написать & - получишь ее адрес.
Если слева написать * - получишь информацию, которая хранится по данному адресу.
* и & - это противоположные действия.

int array[20]; - это обычный массив.
При этом, если в программе употребить просто array - это будет указатель на начало этого массива.
int * array[20]; - это массив из двадцати указателей, каждый из которых может указывать на int.

Различие между точкой и стрелочкой вот какое:
a->b - это все равно что (*a).b
Так что, точка пишется после названия структуры, а стрелочка - после указателя на структуру.

Reply

evilduckk October 21 2011, 11:37:22 UTC
*а - содержит адрес переменной а?

Reply

stzozo October 21 2011, 11:44:31 UTC
Наоборот.
&a - это адрес переменной а.
Предположим, у нас есть шкаф с пронумерованными ячейками:
0:[ ], 1:[ ], 2:[ ], 3:[ ];
Мы в него положили цифры:
0:[ 1 ], 1:[ 3 ], 2:[ 0 ], 3:[ 2 ];
Тогда *0 - это 1, *3 - это 2.
Предположим, переменная a живет в нулевой ячейке, а b - в первой ячейке.
Тогда a == 1, b == 3, но &a == 0, &b == 1.
Понятно?

Reply

evilduckk October 21 2011, 12:04:35 UTC
Ага, надо переварить...

Reply


stychos October 21 2011, 11:31:39 UTC
array[20] = &array[0] + 19*sizeof(datatype);
Какой ужас, сам все забыл :(

Reply

evilduckk October 21 2011, 11:32:19 UTC
Пожалуйста, без нецензурщины в моем журнале >___

Reply

(The comment has been removed)

stychos October 22 2011, 06:44:11 UTC
Почему 20?

Reply


anonymous October 21 2011, 15:14:00 UTC
Привет.
Каменты не читал, не знаю, посоветовали ли такую книжку: Андрей Богатырев. Руководство полного идиота по программированию (на языке Си): http://lib.ru/CTOTOR/starterkit.txt
Кроме того, (и об этом, вроде, где-то в джуйке говорили) хорошее понимание работы с указателями дает ассемблер с нормальным синтаксисом. Рекомедую FASM http://flatassembler.net/ Там и документация приличная есть.
Я, к примеру, на С после ассемблера писать начал. :)

Reply


Leave a comment

Up