У меня проблема с указателем на массив структур.
Я объявляю и инициализирую три точки в структуре, которая имеет член val
. Я создаю указатель arr
на массив указателя на структуру. Затем я создаю указатель pa
на указатель arr
и указатель pa1
на pa
.
Я сталкиваюсь с проблемой, когда пытаюсь извлечь второй элемент arr
с помощью pa1
.
Main. cpp
#include<iostream>
#include<cstdio>
struct a{
int val;
};
int main(){
// create structures
a *a1 = new a;
a1->val = 5;
a *a2 = new a;
a2->val = 3;
a *a3 = new a;
a3->val = 4;
a *arr[3] = { a1, a2, a3 };
a **pa = arr;
std::cout << "Using pa:\n";
std::printf( "1st val: %d\n", (*(pa+0))->val );
std::printf( "1st pos: %p\n", (*(pa+0)) );
std::printf( "2nd val: %d\n", (*(pa+1))->val );
std::printf( "2nd pos: %p\n", (*(pa)+1) ); // modified
std::cout << std::endl << std::endl;
// a pointer to pa's value
a *pa1 = *pa;
std::cout << "Using pa1:\n";
std::printf( "1st val: %d\n", pa1->val );
std::printf( "1st pos: %p\n", pa1 );
std::printf( "2nd val: %d\n", (pa1+1)->val );
std::printf( "2nd pos: %p\n", pa1+1 );
delete a1, a2, a3;
return 0;
}
Тогда я получаю результат, как показано ниже,
Using pa:
1st val: 5
1st pos: 0000000000e761e0
2nd val: 3
2nd pos: 0000000000e761e4
Using pa1:
1st val: 5
1st pos: 0000000000e761e0
2nd val: 0
2nd pos: 0000000000e761e4
Вопрос в том, почему 2nd val
из pa1
не 3 , а 0 ?
Оба pa
и pa1
, похоже, указывают на один и тот же адрес 0000000000e761e4
.
ОБНОВЛЕНИЕ
Строка // modified
должна быть std::printf( "2nd pos: %p\n", *(pa+1) );
.
Результат выглядит следующим образом:
Using pa:
1st val: 5
1st pos: 0000000000ee61d0
2nd val: 3
2nd pos: 0000000000ee61f0
Using pa1:
1st val: 5
1st pos: 0000000000ee61d0
2nd val: 0
2nd pos: 0000000000ee61d4
2nd pos
из pa
и pa1
на самом деле не одно и то же.
Теперь вопрос: Как мне получить второй элемент из arr
, используя pa1
?