Member 13213769 Ответов: 1

Не могу получить эти несколько строк кода


не можете понять этот вывод кода из 3-й строки? объясните мне, пожалуйста, я новичок.

Что я уже пробовал:

#include<stdio.h>
#include<conio.h>

int main()
{
  int i=4,*j,*k;
  printf("\ni=%d",i);
  printf("    &i=%u",&i);

  j=&i;
  printf("\n\ni=%d",i);
  printf("   j=%d",j);
  printf("    *j=%u",*j);
  printf("    &j=%u",&j);

  j=j+1;
  printf("\n\ni=%d",i);
  printf("    j=%d",j);	
  printf("    *j=%u",*j);
  printf("    &j=%u",&j);

  j=j+9;
  printf("\n\ni=%d",i);
  printf("     j=%d",j);
  printf("    *j=%u",*j);
  printf("    &j=%u",&j);

  k=j+3;
  printf("\n\ni=%d",i);
  printf("    j=%d",j);
  printf("    *j=%u",*j);
  printf("    k=%d",k);
  printf("    *k=%u",*k);
  printf("    &j=%u",&j);
  printf("    &k=%u",&k);
}

1 Ответов

Рейтинг:
0

OriginalGriff

Все дело в указателях и в том, что они собой представляют: j и k объявляются как переменные" указатель на целое число", что означает, что они не содержат целочисленного значения таким же образом, как i действительно, они содержат значение, которое говорит вам, где находится фактическое целочисленное значение.
Если вы думаете об автомобилях, "эта машина", "та машина", "моя машина", "ваша машина" - все это "указатель на автомобиль": они не идентифицируют конкретный автомобиль, они идентифицируют его косвенно-вы можете указать пальцем на другой автомобиль и использовать тот же термин "эта машина" или "та машина", или вы можете продать свой текущий Ford и купить Mercedes, и "моя машина" все равно будет работать и идентифицировать текущий автомобиль, который вы хотите водить в магазины.

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

j=&i;
Говорит: "Возьмите адрес переменной i и вставил в переменную j"
Когда вы печатаете j вы получаете номер, который является адресом i:
printf("   j=%d",j);

Чтобы получить доступ к самому целочисленному значению, вы должны "разыменовать" указатель с помощью звездного оператора '*':
printf("    *j=%u",*j)
Который использует адрес в j чтобы получить доступ к целому числу, на которое он указывает, и выводит значение целочисленного значения.
С этого момента ваш код становится опасным и делает вещи, которые вы не должны делать - особенно если вы хотите, чтобы ваше приложение работало без сбоев, было надежным и ремонтопригодным.
j=j+1;
Увеличение стоимости j очевидно, но это увеличивает его на размер того, на что он указывает - целое число. Что означает после этого, что он указывает на что-то другое, чем i (на самом деле он указывает на себя в большинстве реализаций C или C++), и это делает его опасным - вы не знаете, что произойдет, если вы его используете. В большинстве случаев он что-то сделает (хотя результаты не всегда предсказуемы), но если вы начнете писать значения, вы очень легко можете вызвать сбой вашей программы.
Делающий это:
j=j+9;
...
k=j+3;
Это еще хуже, потому что он перемещает указатель далеко за пределы памяти, которую должна использовать ваша функция, и это увеличивает вероятность того, что у вас возникнут проблемы.
Не делай этого! Многие ошибки кода связаны с тем, что указатели содержат значения, которые они не должны содержать - unitialized values, outside your memory values, указатели на данные, которые были повторно использованы, - поэтому будьте очень осторожны, чтобы убедиться, что при изменении указателя вы держите его в памяти, к которой он должен получить доступ!