Используя указатель на массив символов, можно получить доступ к значениям в этом массиве? - PullRequest
19 голосов
/ 02 сентября 2011

Я создал ptr как указатель на массив из 5 символов.

char (*ptr)[5];

присвоил ему адрес массива символов.

char arr[5] = {'a','b','c','d','e'};
ptr = &arr;

используя указатель ptr, я могу получить доступ к значениям символов в этом массиве?

printf("\nvalue:%c", *(ptr+0));

Не печатает значение.

В моем понимании ptr будет содержать базовый адрес массива, но на самом деле он указывает на память, необходимую для полного массива (то есть 5 символов). Таким образом, когда ptr увеличивается, он продвигается на sizeof(char)*5 байтов. Так нельзя ли получить доступ к значениям массива, используя этот указатель на массив?

Ответы [ 4 ]

18 голосов
/ 02 сентября 2011

Когда вы хотите получить доступ к элементу, вы должны сначала разыменовать свой указатель, а затем проиндексировать нужный элемент (который также разыменовывается).т.е. вам нужно сделать:

printf("\nvalue:%c", (*ptr)[0]);, что совпадает с *((*ptr)+0)

Обратите внимание, что работа с указателем на массивы не очень распространена в C. Вместо этого нужно просто использоватьуказатель на первый элемент в массиве, и либо обрабатывать длину как отдельный элемент, либо помещать значение senitel в конец массива, чтобы можно было узнать, когда заканчивается массив, например,

char arr[5] = {'a','b','c','d','e',0}; 
char *ptr = arr; //same as char *ptr = &arr[0]

printf("\nvalue:%c", ptr[0]);
6 голосов
/ 02 сентября 2011

Большинство отвечающих даже не знают, что такое указатель массива ...

Проблема в том, что вы выполняете арифметику указателей с указателем массива: ptr + 1 будет означать «переход на 5 байт вперед»так как ptr указывает на 5-байтовый массив ".

Сделайте так вместо этого:

#include <stdio.h>

int main()
{
  char (*ptr)[5];
  char arr[5] = {'a','b','c','d','e'};
  int i;

  ptr = &arr;
  for(i=0; i<5; i++)
  {
    printf("\nvalue: %c", (*ptr)[i]);
  }
}

Возьмите содержимое того, на что указывает указатель массива, и вы получите массив.Так что они работают так же, как любой указатель в C.

1 голос
/ 04 июля 2018

Использование указателя перед символьным массивом

Обычно символьный массив используется для хранения в нем отдельных элементов, т. Е. 1 байт каждый

например:

char a[]={'a','b','c'};

мы не можем хранить в нем несколько значений.

используя указатель перед массивом символов, мы можем хранить элементы многомерного массива в массиве

т.е.

char *a[]={"one","two","three"};
printf("%s\n%s\n%s",a[0],a[1],a[2]);
0 голосов
/ 02 сентября 2011

Вы должны создать ptr следующим образом:

char *ptr;

Вы создали ptr как массив указателей на символы.Приведенное выше создает единственный указатель на символ.

Редактировать: полный код должен быть:

char *ptr;
char arr[5] = {'a','b','c','d','e'};
ptr = arr;
printf("\nvalue:%c", *(ptr+0));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...