Что происходит, когда вы присваиваете строку переменной-указателю? - PullRequest
0 голосов
/ 08 июня 2019

Я не понимаю, на что указывает эта переменная ptr. Это один элемент строки x? Вся строка?

int x[]={10,20,30,40,50};
int *ptr=x;
printf("%d",*(ptr+2));
printf("%d",*(ptr)+2);

Ответы [ 4 ]

1 голос
/ 09 июня 2019

Это создает ситуацию, в которой ptr псевдонимы x.

x and ptr are aliased.

Например ptr[2] == x[2] == *(x + 2) == 30. Однако x и ptr не являются одним и тем же объектом в компиляторе C; в частности, компилятор знает размер x, sizeof x = sizeof(int) * 5, а не sizeof ptr = sizeof(int *). Кроме того, тип x распадается на constant pointer to int, а тип ptr равен pointer to int; это означает, что ptr++ хорошо, но не имеет смысла делать x++.

0 голосов
/ 09 июня 2019

Указатель указывает на адрес памяти.При объявлении и инициализации int *ptr=x;, ptr назначается адрес памяти, с которого первый элемент x начинается в памяти.Таким образом, если x состоит из трех 4-байтовых целых чисел, которые содержат десятичные значения 10, 20, 30 и младший байтовый адрес первого целого числа начинается с адреса 0x1010, ptr будет присвоено значение 0x1010, а адреса памятизанятое x будет выглядеть как

Addr |1010|1011|1012|1013|1014|1015|1016|1017|1018|1019|101A|101B|
     +====+====+====+====+====+====+====+====+====+====+====+====+
Val  | 0A | 00 | 00 | 00 | 14 | 00 | 00 | 00 | 1E | 00 | 00 | 00 |
     +====+====+====+====+====+====+====+====+====+====+====+====+

(все адреса и значения, указанные выше, отображаются в шестнадцатеричном формате)

В приведенном выше примере используется архитектура с прямым порядком байтов, например Intel x86где младший байт многобайтового целого числа сохраняется в младшем адресе.(Другие порядки многобайтовых целых чисел в памяти используются на других архитектурах, но я не буду здесь их рассматривать).

Надеюсь, это поможет.

0 голосов
/ 08 июня 2019

Указатель указывает на адрес . Чтобы убедиться, вы можете распечатать разные адреса разных элементов массива, используя флаг %p в printf.

printf("%p\n", ptr[0]);
printf("%p\n", ptr[1]);
printf("%p\n", ptr[2]);
0 голосов
/ 08 июня 2019

Вывод: - 30 12 ptr - указатель, указывающий на первый элемент x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...