Как получить доступ к значению, на которое указывает указатель внутри массива указателей? - PullRequest
0 голосов
/ 13 сентября 2018

Если у меня есть массив целочисленных указателей, и я хочу получить доступ к значению целого числа, на которое указывает один из указателей в массиве, как это будет сделано?

Пример:

 int *p0, *p1, *p2, *p3, *p4;
 int* index[5] = {p0, p1, p2, p3, p4};
 int variable1 = 1;
 int variable2 = 2;
 int variable3 = 3;
 p0[0] = variable1;
 p0[1] = variable2;
 p0[2] = variable3;

Как я могу получить доступ к значению 123 через массив index []?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Как я могу получить доступ к значению 123 через массив index []?

Первая строка вашего кода не нужна, а последние три строки не делают то, что вы думаете, они делают.

p0[0] = variable1; //*(p0 + 0) = variable1
p0[1] = variable2; //*(p0 + 1) = variable2
p0[2] = variable3; //*(p0 + 2) = variable3

То, что вы говорите своей программе в отношении первой строки, - это перейти в область памяти, куда указывает p0, и сохранить там значение variable1. Но p0 - неинициализированный указатель, поэтому поведение не определено. Затем вы просите вашу программу указать тот же адрес памяти и смещение и что-то там сохранить. Это опасно и может привести к ошибке сегментации.

То, что вы хотите, выглядит примерно так:

int* index[3];

int variable1 = 1;
int variable2 = 2;
int variable3 = 3;

index[0] = &variable1;
index[1] = &variable2;
index[2] = &variable3;

for(int i = 0; i < 3; i++){
    printf("*index[%d] = %d\n", i, *index[i]);
}
0 голосов
/ 13 сентября 2018

Если у меня есть массив целочисленных указателей, и я хочу получить доступ к значению целого числа, на которое указывает один из указателей в массиве, как это будет сделано?

Существуют некоторые возможные варианты, но наиболее ясным и наиболее общепринятым может быть использование оператора индексирования [] для выбора нужного элемента массива (указателя) и оператора разыменования * в результат для получения указанного инт. Оператор индексирования имеет более высокий приоритет (он принадлежит к одной группе операторов с наивысшим приоритетом), но если вы этого не помните и по какой-то причине не можете его найти, то вы всегда можете использовать скобки, чтобы обеспечить желаемый порядок оценки.

Пример:

int *array[2];

// ... assign valid pointer values to array elements ...

int x = *array[1];

Это не особенно отличается от того, как вы используете элемент массива любого другого типа в качестве операнда любого другого оператора.

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