Призначення вказівника - зберегти адресу певної змінної. Тоді структура пам'яті наступного коду повинна виглядати так:
int a = 5;
int *b = &a;
...... адреса пам'яті ...... значення
a ... 0x000002 ................... 5
b ... 0x000010 ..... .............. 0x000002
Гаразд Тоді припустимо, що зараз я хочу зберегти адресу вказівника * b. Тоді ми зазвичай визначаємо подвійний покажчик ** c, як
int a = 5;
int *b = &a;
int **c = &b;
Тоді структура пам'яті виглядає так:
...... адреса пам'яті ...... значення
a ... 0x000002 ................... 5
b ... 0x000010 ..... .............. 0x000002
c ... 0x000020 ................... 0x000010
Отже ** c посилається на адресу * b.
Зараз моє запитання: чому цей тип коду,
int a = 5;
int *b = &a;
int *c = &b;
генерувати попередження?
Якщо метою вказівника є просто збереження адреси пам'яті, я думаю, що не повинно бути ніякої ієрархії, якщо адреса, яку ми збираємося зберегти, стосується змінної, вказівника, подвійного вказівника тощо, тому код нижченаведеного типу повинен бути дійсним.
int a = 5;
int *b = &a;
int *c = &b;
int *d = &c;
int *e = &d;
int *f = &e;
warning: incompatible pointer types initializing 'int *' with an expression of type 'int **'; remove & [-Wincompatible-pointer-types]
. Це могло б все зрозуміти.