Окей, я честно всю ночь пыталась с этим разобраться.
Но почему-то мне очень хочется сказать, что это какая-то гребаная женская логика (да, я шовинистическая свинья!).
Серьезно, на несколько страниц гуглопоиска по разным ключевым словам - ничерта непонятно, плюс разный синтаксис везде.
[Внимание! Пост проапдейчен в связи с тем, что я разобралась с
(
Read more... )
Comments 32
(The comment has been removed)
Вроде бы так логично все, спасибо!
Получается, что звездочки переносятся налево как амперсанды и наоборот вправо.
Но в разных источниках разное пишут. Например, что стандартное задание указателя - это *a=&b (int *a; int b).
Я верно понимаю, что массив - это набор указателей на несколько переменных?
struct1
{
...;
struct2
{
...;
int name;
}
}
А куда там указатели, я вообще не поняла, но в примерах они были.
Reply
(The comment has been removed)
Reply
*a=&b - a указывает на значение b?
да
*a=b - a указывает на значение b?
нет указывает на ерунду.
*array[20] - указатель?
Насколько я помню работать не будет :]
array[20] - указатель?
Не совсем.
array - указатель?
Нет.
struct1.struct2.name - так нельзя?
Можно если структура объявлена не через указатель.
s2->name - так правильно?
Да.
PS А почему ви спрашиваете?
Reply
*a=b - а разве оно не указывает на значение по адресу b?
Про массивы пишут, что они работают как указатели. Но что это значит - я не поняла.
Reply
*a=b - а разве оно не указывает на значение по адресу b?
неа.
a=&b - запишет в указатель адрес b.
*a=b - запишет значение b в ту область памяти куда указывает указатель a.
Массивы действительно работают как указатели. Фишка тут какая [] используются для осуществления смещения. Это смещение будет равно тому количеству байт которые занимает объявленный тип массива.
Собственно в указателях надо помнить ровно одну хрень. Указатель это такая переменная которая содержит адрес памяти и ничего больше. Операция * позволяет считать данные которые лежат по этому адресу памяти. И да, указатель ничего не знает что там такое лежит. Для лучшего понимания надо поиграться с malloc().
Reply
*a=b - запишет значение b в ту область памяти куда указывает указатель a.
Кстати да. Запись большего объекта в меньший объем выделенной памяти будет приводить к segfault
Reply
Если слева написать * - получишь информацию, которая хранится по данному адресу.
* и & - это противоположные действия.
int array[20]; - это обычный массив.
При этом, если в программе употребить просто array - это будет указатель на начало этого массива.
int * array[20]; - это массив из двадцати указателей, каждый из которых может указывать на int.
Различие между точкой и стрелочкой вот какое:
a->b - это все равно что (*a).b
Так что, точка пишется после названия структуры, а стрелочка - после указателя на структуру.
Reply
Reply
&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
Reply
Какой ужас, сам все забыл :(
Reply
Reply
(The comment has been removed)
Reply
Каменты не читал, не знаю, посоветовали ли такую книжку: Андрей Богатырев. Руководство полного идиота по программированию (на языке Си): http://lib.ru/CTOTOR/starterkit.txt
Кроме того, (и об этом, вроде, где-то в джуйке говорили) хорошее понимание работы с указателями дает ассемблер с нормальным синтаксисом. Рекомедую FASM http://flatassembler.net/ Там и документация приличная есть.
Я, к примеру, на С после ассемблера писать начал. :)
Reply
Leave a comment