Компьютерный форум

Компьютерный форум (http://www.hardforum.ru/)
-   С/С++ (http://www.hardforum.ru/f146/)
-   -   Указатели в С (http://www.hardforum.ru/t139646/)

Valensiya 16.07.2022 11:02

Указатели в С
 
c Код:
#include <stdio.h>
void main(void)
{
  int a[100], n, *end, *p,k=0;
  n=10;
  end = a + n;
  printf("end %p\n a = %p n= %d\n", end,a,n);  
  for (p = a; p < end; p++)      
  {
    printf("%4d   %p  %d\n" , *p,p,k++);
  }
}

Я нашла в интернете этот код и у меня есть нсколько вопросов:
1. В строке end = a+n к массиву а прибавилась переменная n=10, что это значит? Добавилось 10 ячеек? В переменную end записался адрес, это адрес, где находится
массив?
2. Я вывела значение а - вывелся адрес. а было массивом, а стало адресом?
3. В цикле p = a, т.е. в переменную р сохранился адрес из а, а дальше p<end. p++.
end - это тоже адрес, значит к адресу будет прибавляться 1 (как?) до тех пор, пока
p не станет равным либо большим, чем end? Просто уточняю

Rius 17.07.2022 10:10

1. В переменную end (указатель) поместилось значение, указывающее на начало массива a, но смещённое на 10 ячеек (размер ячейки массива, int; не 1 байт, а в зависимости от платформы и компилятора). По простому - указатель указывает теперь на 10-й элемент массива.
2. Переменную "имя массива" можно конвертировать в указатель. Саму по себе переменную можно считать указателем на область памяти, где располагается нулевой элемент массива. Если интересует, как правильно, надо стандарт Си читать.
3. В p поместился адрес начала массива, нулевого элемента. Далее end - адрес 10-го элемента. Цикл идёт, пока указатель p не достигнет нужного элемента.

В данной задаче эти конструкции приведут к одному результату:
c Код:
int *p = a;
int *p = &a[0]

c Код:
int *p = a + 10;
int *p = &a[10]

c Код:
*p = 3;
a[0] = 3;

c Код:
*(p + 2) = 5;
a[2] = 5;


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

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.