Изменить адрес указателя - PullRequest
0 голосов
/ 19 марта 2020

У меня есть массив целых чисел с именем bufferA [] и указатель * ptr, который указывает на первое целое число в этом массиве Array bufferA [0]. Теперь я хотел бы изменить указатель так, чтобы он указывал на второе значение bufferA [1]. Когда я отлаживаю код, я вижу, что адрес первого целого числа в этом массиве равен 0x1702, и теперь я хотел бы изменить указатель, чтобы он указывал на 0x1704, который является адресом bufferA [1]. Вероятно, есть какой-то способ сделать это без указателя и просто прочитать значения массива, но этот массив передается из AD C -модуля в модуль DMA и вместо того, чтобы просто брать массивы (что делает их хранение в DMA бесполезно) я хотел бы просто взять адрес первого значения и изменить его, чтобы прочитать следующие значения. я надеюсь, что это как-то объясняет мою проблему ...

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Массивы в C всегда передаются по ссылке, вы не передаете их в качестве аргумента функции! (Это первый урок для начинающих C программистов)

Сначала прочитайте кое-что об указателях в C, но вкратце:

int a = 5;    // declares a integer-type of value 5
int* pta;     // declares a pointer-to-integer type
pta = &a      // assigns the **address** of a to pta (e.g. 0x01)
int b = *pta  // assingns the **value** of the address location that pta is pointing to into b
              // (i.e. the contents of memory address 0x01, which is 5)
*pta = 4      // assigns 4 to the content of the memory address that pta is pointing to.

// now b is 5, because we assigned the value of the address that pta was pointing to
// and a is 4, because we changed the value of the address that pta was pointing to
// - which was the address where variable a was stored

Переменная bufferA сама по себе является указателем на адрес первого элемента. bufferA + 1 дает вам адрес второго элемента, потому что массивы хранятся в памяти последовательно.

Или, если вы хотите более читаемый формат:

&bufferA[0]  is the same as  bufferA         (address of the first element(e.g 0x11) 
&bufferA[1]  is the same as  bufferA + 1     (address of the second element(e.g 0x12) 
buffer[2]    is the same as  *(buffer + 2)   (value at the address of the third element)
0 голосов
/ 21 марта 2020

Как насчет ptr = ptr + 1;? (Или эквивалентно в этом контексте ptr += 1; или ptr++; или ++ptr;?) Компилятор C знает, сколько байтов занято элементом, на который указывает ptr, из-за его объявленного типа, и будет автоматически увеличить указатель на нужное количество байтов.

...