#c
Вопрос:
У меня есть вопрос об указателях в C. Например:
int data[SIZE] = {2,4,5,1,0};
int *p = amp;data[2];
int **s=amp;p;
p ;
printf("%p ", *s);
Здесь указатель *равен *p, т. е. адрес *равен *p?
*Это может быть простой вопрос, но мы не потратили достаточно времени на изучение C
Комментарии:
1. Нет, значение
s
-это местоположение переменнойp
. Ценность*s
-это ценностьp
, а не то, на что*p
указывает. Для этого вам понадобится**s
.2.
printf()
Технически вы УБ, по крайней мере, когдаsizeof *s != sizeof(void*)
. Но в большинстве систем это работает нормально, потому что все указатели имеют одинаковый размер. Лучше было бы привести указатель явно к(void *)
Ответ №1:
После деклараций у вас есть следующее:
s == amp;p // int ** == int **
*s == p == amp;data[2] // int * == int * == int *
**s == *p == data[2] == 5 // int == int == int == int
После p
:
*s == p == amp;data[3]
**s == *p == data[3] == 1
Ответ №2:
Если ты побежишь
int data[5] = {2,4,5,1,0};
int *p = amp;data[2];
int **s=amp;p;
p ;
int data[5] = {2,4,5,1,0};
int *p = amp;data[2];
int **s=amp;p;
p ;
printf("*p: %d n", *p);
printf("amp;p: %p n", amp;p);
printf("s: %p n", s);
printf("*s: %p n", *s);
printf("**s: %d n", **s);
вы получите:
*p: 1
amp;p: 0x7ffc69a74650
s: 0x7ffc69a74650
*s: 0x7ffc69a7466c
**s: 1
Что показывает, что значение, указанное обоими *p
и **s
, одинаково (1), также amp;p == s
, но amp;p
и *s
не совпадает, так как есть дополнительный «шаг».
Ответ №3:
Вот возможное выполнение вашей программы:
int data[SIZE] = {2,4,5,1,0};
// your memory looks like this:
// Address (name) -> Value
// 0x80 (data[0]) -> 2
// 0x84 (data[1]) -> 4
// 0x88 (data[2]) -> 5
// 0x8C (data[3]) -> 1
// 0x90 (data[4]) -> 0
int *p = amp;data[2];
// 0x80 (data[0]) -> 2
// 0x84 (data[1]) -> 4
// 0x88 (data[2]) -> 5
// 0x8C (data[3]) -> 1
// 0x90 (data[4]) -> 0
// 0xC0 (p) -> 0x88
int **s=amp;p;
// 0x80 (data[0]) -> 2
// 0x84 (data[1]) -> 4
// 0x88 (data[2]) -> 5
// 0x8C (data[3]) -> 1
// 0x90 (data[4]) -> 0
// 0xC0 (p) -> 0x88
// 0xD8 (s) -> 0xC0
p ;
// 0x80 (data[0]) -> 2
// 0x84 (data[1]) -> 4
// 0x88 (data[2]) -> 5
// 0x8C (data[3]) -> 1
// 0x90 (data[4]) -> 0
// 0xC0 (p) -> 0x8C
// 0xD8 (s) -> 0xC0
printf("%p ", *s); //Will print 0x8C
Так что нет, *s (значение, указанное s) будет равно не *p (значение, указанное p), а p (адрес указателя p).