Указатели в C-программе

#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).