Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/140: Рейтинг темы: голосов - 140, средняя оценка - 4.90
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485

В чем отличие & и *

25.04.2015, 06:50. Показов 28755. Ответов 58
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как я понимаю, & и * - это самое сложное в Си. Но они - краеугольный камень, без которого язык превращается в малоподвижного парализованного.
Нам объясняли, читал, смотрел ролики.... Не догоняю!
Где-то это именуется ссылки-указатели, где-то * - "разыменованием".... Словом мрак!
Светлые умы, озарите!!!! )
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2015, 06:50
Ответы с готовыми решениями:

В чем отличие & и && ?
В чем отличие & и && ? например if (px == x && py == y) и if (px == x & py == y)

В чем отличие между Microsoft Visual studio 8 и MVS 5&
Уважаемые,программисты!подскажите пожалуйста в чем отличие программ C#,написанных на Visual studio 8 и Visual studio 5?сложно ли переносить...

В чем отличие int &f( ) от int f( )
Что такое int & и чем отличается от int ? #include <iostream> using std::cout; using std::endl; int some(int i) { return...

58
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
25.04.2015, 19:07  [ТС]
Студворк — интернет-сервис помощи студентам
& != *
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
25.04.2015, 19:10
Цитата Сообщение от Albaz Посмотреть сообщение
давайте пока разберемся с &
а че с ним разбиратся?
вот допустим я живу по адресу такому то
он у меня есть в паспорте(регистрация/прописка)
и вот прихожу я в какое нибудь учереждение, и там смотрят мою прописку, берут адрес, на Си это будет &
1
25.04.2015, 19:11

Не по теме:

Цитата Сообщение от Albaz Посмотреть сообщение
void же, как сказано в той же полу/не/до/бракованной книжке, есть случай особый.
Там void* потому что туда можно вписать указатель на любой тип. Обратите внимание на код выше
Цитата Сообщение от ValeryS Посмотреть сообщение
C
1
int *a=(int*)malloc(sizeof(int));
malloc() возвращает void* - указатель на неопределённый тип. Как вам нужно, тот и будет.

0
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
25.04.2015, 20:23  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
а че с ним разбиратся?
Допустим, ф-ция
C
1
scanf("%i", &a);
что произошло с int a?
&a что в ней поменял????
"оператор & выдает адрес объекта"
" * есть оператор косвенного доступа. Примененный к указателю, он выдает объект"
В scanf() мы уже получили доступ к объекту а через его адрес. Зачем * ?
"р = &с; присваивает переменной p адрес ячейки c" - зачем нам дополнительная переменная-посредник р к значению с, если это с мы можем поменять при помощи ???
Это, если бы мы:
C
1
2
p = &a;
scanf("%i", p);
Почувствуй разницу с :
C
1
scanf("%i", &a);
Добавлено через 7 минут
Цитата Сообщение от tezaurismosis Посмотреть сообщение
printf("%d (0x%p), %d (0x%p)\n", *ptr1, ptr1, *ptr2, ptr2);
Почему мы меняя форматирование %d (0x%p), выводим переменные то как ptr1, то как *ptr1 ???
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,665
Записей в блоге: 14
25.04.2015, 20:34
Цитата Сообщение от Albaz Посмотреть сообщение
что произошло с int a?
&a что в ней поменял????
&a в переменной ничего не поменял, в scanf нам нужен адрес переменной - мы его туда передаём. Чтобы его получить, мы используем &.
C
1
int a = 10;
a - переменная
&a - её адрес, указатель на него.
*(&a) - снова переменная. Вот для этого нужен *

Добавлено через 1 минуту
Цитата Сообщение от Albaz Посмотреть сообщение
Почему мы меняя форматирование %d (0x%p), выводим переменные то как ptr1, то как *ptr1
Для %d необходима обычная переменная, не указатель. Чтобы его получить из ptr1, нужно его разыменовать, т.е. передать как *ptr1
Для %p необходим указатель, разыменование не нужно, передаём просто ptr1
1
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
25.04.2015, 20:37  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
char c=*a;// присвоить переменной с *значение которое лежит по адресу a
Цитата Сообщение от ValeryS Посмотреть сообщение
a=&b;// в a будет адрес лежать переменной b
Стоп.
Мы разделяем значение переменной и адрес ее местонахождения.
К значению мы имеем доступ через адрес.
По сути, нас интересуют значения.
Хотя значения... доступны через адрес. Одно не есть другое. Но без первого второе не получить. Адреса интересны ради значений. Как это распутать?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
25.04.2015, 22:45
Цитата Сообщение от Albaz Посмотреть сообщение
Адреса интересны ради значений. Как это распутать?
никак не распутать
прими как данное
например есть Вяся он живет по адресу ул Главная дом 3 кв 2 живет один
можем сказать пошел к Васе,обращение по имени
а можем сказать пошел по адресу Главная 3 кв.2, обращение по адресу
и в том и в другом случае один и тот же объект
теперь насчет
Цитата Сообщение от Albaz Посмотреть сообщение
scanf("%i", &a);
её прототип, в данном случае, scanf(char*, int*); на самом деле прототип несколько другой она принимает переменное число параметров
принимает указатель на строку в данном случае "%i" и указатель на переменную типа int
все дело в том что scanf должна записать данные в переменную, но в Си принято что в функцию передаются не сами переменные а их копии, получая адрес(копию адреса) она сможет записать туда значение(передать тому кто живет по ул Главная дом 3 кв 2)
вот например такой случай
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void func(int k)// вот здесь аргумент переменная 
{
k=10;// записали в переменную 10, но это не та переменная которую дала вызывающая сторона  а копия
  // следовательно при выходе из функции копия пропадет и все изменения будут утеряны
 
}
 
void func1(int* k)// вот здесь аргумент указатель, хотя это копия адреса, но указывает он туда же
{
*k=10;// записали по адресу на который указывает указатель, разыменовали указатель, число 10
 
}
 
int k=5;// присвоили переменной число 5
func(k);// вот здесь хотим изменить но ничего не получится,
k осталось равной 5, все изменения произошли с копией  
funk(&k);// вот здесь взяли адрес переменной и отдали функции
//здесь k уже равна 10 поскольку изменения произошли по адресу
теперь насчет разыменования(*k)
вернемся опять к Васе
поймали какого то пацана и сказали передай записку тому кто живет по адресу ул Главная дом 3 кв 2
наш посланец ни сном ни духом кто там живет и вообще Васю в глаза не видел, но передаст записку именно Васе
1
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
27.04.2015, 19:53  [ТС]
Давайте чуть назад
C
1
2
3
4
5
6
7
int main() {
    int x = 10;
    int* ptr1 = &x;
    int* ptr2 = ptr1;
    
    x = 20;
    printf("%d (0x%p), %d (0x%p)\n", *ptr1, ptr1, *ptr2, ptr2);
Почему printf("... *ptr1, ptr1 мы представляем то как переменную, то как указатель * ? Указатель ведь не есть переменная и не трансформируется в нее.

что есть разыменование? * ?
а & это что?
Я пока понял, что & при вызове функции, а * - при объявлении (прототипировании).
Но ведь printf("... *ptr1...) и scanf("... &ptr1...) по сути ВЫЗОВЫ.
*****
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,665
Записей в блоге: 14
27.04.2015, 20:06
Цитата Сообщение от Albaz Посмотреть сообщение
Указатель ведь не есть переменная и не трансформируется в нее
Почему же нет, это переменная типа int*.
Определение переменной из Википедии
Переме́нная в императивном программировании — поименованная, либо адресуемая иным способом область памяти, адрес которой можно использовать для осуществления доступа к данным, находящиеся в переменной (то есть по данному адресу памяти), называются значением этой переменной.
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
27.04.2015, 22:21
Может, еще так будет попонятнее немного

обычная переменная (не указатель) -> яблоко
указатель на эту переменную - точное местоположение этого яблока (например, в центре стола), зная которое, мы всегда можем обратиться к этому значению (взять яблоко) -> т.е., разыменовать.
Иными словами, можно сказать, что указатель - это не само яблоко, а его местоположение, чтобы взять непосредственно яблоко, необходимо указатель разыменовать.
C
1
2
3
4
5
6
7
int x = 10; //10 яблок лежат на столе
int* ptr1 = &x; //записка о том, где находятся 10 яблок (т.е., их местонахождение, адрес)
int* ptr2 = ptr1; //"ксерокопия" записки о местонахождении яблок
    
x = 20; //значение поменялось, 20 яблок - но место тоже: указатель указывает туда же
*ptr1 = 15; //идем туда, где, как нам известно, находятся яблоки, и убираем пять яблок: x = 15
printf("%d (0x%p), %d (0x%p)\n", *ptr1, ptr1, *ptr2, ptr2);
0
27.04.2015, 22:25

Не по теме:

Цитата Сообщение от KOPOJI Посмотреть сообщение
int x = 10; //10 яблок лежат на столе
опять яблоки:)
только прошлый раз были корзинки с яблоками:)

0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
27.04.2015, 22:26
Цитата Сообщение от Albaz Посмотреть сообщение
оператор * есть оператор косвенного доступа
Боюсь спрашивать. Вы в своем ВУЗе курс "архитектура ЭВМ" проходили? Понимаете что такое "косвенная адресация"? Указатели в языке си предоставляют возможность использования этой штуки программистом в полном объеме.
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
27.04.2015, 22:28
Цитата Сообщение от Albaz Посмотреть сообщение
Указатель ведь не есть переменная и не трансформируется в нее.
указатель это тоже переменная, только особого рода
она содержит адрес
поле "Куда" на почтовом конверте, типичный указатель
1
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
27.04.2015, 22:34
C
1
2
3
4
5
6
7
/* выделить область памяти размером sizeof(int) для хранения значения.
Все адреса одного размера и беззнаковые, значение имеет кратность адреса. Но это из другой оперы.*/
int a;
/* выделить область памяти размером sizeof(int*) для хранения адреса.
Разыменовывание указателя (*b = 10) гарантирует что записано будет
ровно sizeof(int) байт.*/
int * b;
0
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
28.04.2015, 07:29  [ТС]
Цитата Сообщение от castorsky Посмотреть сообщение
в своем ВУЗе курс "архитектура ЭВМ" проходили
мы проходили курс кибернетики и Паскаля)))

Добавлено через 32 минуты
Цитата Сообщение от KOPOJI Посмотреть сообщение
переменная (не указатель) -> яблоко
Простите... Не люблю слишком абстрстрагированных вещей. Само "яблоко" - это последовательность байт-ячеек в памяти. Переменная - это имя, за которым закреплен адрес тех ячеек. Имя не есть предмет. И местоположение не есть предмет. Но мы оперируем с вещами, как и сказали наши друзья выше: 1) по имени - найди Васю. 2) по адресу - приди туда, и отдай тому, кто там живет - это окажется Вася.
Указатель - тот же адрес, только другое имя, что я назвал синонимичностью. Т.е. обращению к одному адресу под разными именами.
Цитата Сообщение от tezaurismosis Посмотреть сообщение
переменная типа int*.
и равно просто переменная int похоже одно и то же, но разрозненное словоблудием.
Значит, в программе я могу везде объявлять и использовать исключительно int*, и единственное ограничение - помноить об их абсолютной глобальности. Ведь "локальная" переменная int а внутри функции, как я догадываюсь, не есть та же int а глобальная. Это только мы их считаем тезками. В компиле за названием локальной привешиваются префиксы родительской функции, и по сути это совершенно не одноименные переменные, хотя нам они представлены тезками.
Т.е. локальность - глобальность это обертка словоблудия, "удобства для масс".
Настораживает нечто, что объявленное как тип указательный int* ptr1 рассматривается потом как обычный printf("... ptr1, ...
Ясно, что переменная и указатель - суть имена адресов, шаг которых зависти от типа(char, int). Но раз уж нагородили сказочки про переменные - указатели, то врите уж до конца!
А тут они вдруг раскололись)))

Добавлено через 10 минут
Итак, мы работаем с предметом в памяти ЭВМ через его местонахождение, точнее, по имени месторасположения.
Итак: имя-> место-> предмет. Т.е. работаем не с самим предметом напрямую, а косвенно - через его местоположение и именную обертку местоположения.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
28.04.2015, 07:32
Цитата Сообщение от Albaz Посмотреть сообщение
Т.е. локальность - глобальность это обертка словоблудия, "удобства для масс".
это совершенно другая песня
глобальные видимы во всей программе, с точки зрения железа живет и умирает вместе с программой
локальная видна на данном участке, например в функции, живет только в функции, как зашли в функцию переменная появилась, как ушли умерла
0
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
28.04.2015, 07:45  [ТС]
Итак, вначале мне казалось, что указатель отличен от переменной лишь тем, что указатель не может сам резервировать место в памяти для данных, а только может выступать синонимом пространства, уже закрепленного за "нормальной" переменной.
Теперь я прихожу к выводу, что отличаются они лишь вариациями локальность/глобальность.
Так что все это словоблудие.
Когда хочешь преодолеть сказочку о локальности - ставь звездочку * и все ок)))

Добавлено через 5 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
живет и умирает вместе с программой
принимаю ценную поправку. В железе да)
Тогда... в интерпретации нашего восприятия: локальная не только не обозначает того же адреса, что и глобальная, но и живет лишь во время исполнения функции.
Но то, что они "разноименны" на деле подтверждается тем, что в миг своего исполнения, локальная не переписывает глобальной.
Потому срок жизни здесь не принципиален.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
28.04.2015, 07:48
Цитата Сообщение от Albaz Посмотреть сообщение
Теперь я прихожу к выводу, что отличаются они лишь вариациями локальность/глобальность.
неправильный вывод
и указатели могут быть локальными и переменные
одно и тоже место в памяти могут занимать разные переменные, в зависимости от времени исполнения
вернемся опять к Васе
он живет по адресу, ну и так далее
но там расположена гостиница
и Вася локальный, временный житель
и вот мы записали адрес, и года через два решили передать записку, но записка уже попала к Пете, который живет там на данный момент
указатель не вылидный, адрес протух

Добавлено через 2 минуты
Цитата Сообщение от Albaz Посмотреть сообщение
Но то, что они "разноименны" на деле подтверждается тем, что в миг своего исполнения, локальная не переписывает глобальной.
Потому срок жизни здесь не принципиален.
ты не поверишь, но и имя здесь роли не играет
C++
1
2
3
4
5
int a;// глобальная переменная, которая живет вечно
int main()
{
int a;// локальная переменная, которая никоим образом не связана с глобальной, у них разные адреса
}
0
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
28.04.2015, 08:02  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
имя здесь роли не играет
Ясно, что роль - значение адреса.
Цитата Сообщение от ValeryS Посмотреть сообщение
указатель не вылидный
Указатели загнали меня к Ассемблерщикам.Вот что они написали
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
теперь же я испытываю какое-то отвращение к сишным указателям
будьте осторожны: если вы не обладаете информацией об адресах границ массива (указатель вам об этом не сообщит, а значит, это должно быть известно откуда-то еще), ситуация вскоре может стать непредсказуемой. Никакие операции с участием указателей не проверяются: указатель – это всего лишь адрес памяти длиной в слово1, и арифметические операции, которые вы к нему применяете, просто слепо исполняют то, о чем вы просите. Это делает указатели невероятно быстрыми и при этом ужасно неосведомленными. Указатель недостаточно умен даже для того, чтобы понять, что он указывает на отдельный объект

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
указатели могут быть локальными
это нечто новенькое.
то пишется, что указатели дают возможность преодолеть локализацию функций, то...
?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
28.04.2015, 08:10
Цитата Сообщение от Albaz Посмотреть сообщение
Указатели загнали меня к Ассемблерщикам.
Я в теме
бывал там
может быть Байт и прав чтобы понять указатели нужно спустится до уровня ниже
но у меня другое мнение, есть опасность что за "деревьями не увидишь леса"
архитектуры слишком разные и ассемблеров куча
знаешь такое понятие "черный ящик" ? Это такое устройство которому что то подают на вход и оно что то выдает на выходе
Мы знаем что должно быть на выходе при определенном сигнале на входе, как это реализовано внутри нас не интересует
простейший пример функция sin(или любая другая) на вход подали угол и получили значение, как он там внутри рассчитывает без разницы, главное чтобы правильно

Добавлено через 1 минуту
Цитата Сообщение от Albaz Посмотреть сообщение
то пишется, что указатели дают возможность преодолеть локализацию функций, то...
конкретно где?
мне кажется что ты путаешься в понятиях, и возлагаешь на указатели слишком много
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.04.2015, 08:10

query='SELECT * FROM resume WHERE ' & ''' & RecSet('place')& ''' & '=' & '''& s_loc &''' & - что не так?
упростил для краткости запрос. в чем ошибка? RecSet - это коннекшн. query='SELECT * FROM resume WHERE ' & ''' &...

В чем разница между & и &&
подскажите в чем разница между двумя операторами на практике & и && в книге приведены простенькие примеры и результат у них...

Отличие std::move от & ?
Здравствуйте, Подскажите пожалуйста, никак не могу понять, чем принципиально отличается std::move от & ? То есть и то и то...

error '80020009' Îøèáêà. /lalala/profile.asp, line 28
При простейшем и сто раз работавшем скрипте, вылетает ошибка! след. содержания error '80020009' ...

Помогите найти драйвера для pci\ven_8086&DEV_266E&SUBSYS_A002145&REV_05\3&13C0B0C5&0&F2
pci\ven_8086&DEV_266E&SUBSYS_A002145&REV_05\3&13C0B0C5&0&F2 Мультимедиа аудиоконтроллер помогите плз найти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru