Что именно int/char, когда мы объявляем двойной указатель (**q)

Давайте возьмем 64-битную машину

где указатель имеет 8 байтов в 64-битной машине

int *p ; // it is a pointer to integer variable so when i increment p
         // i.e., p++ it will increment by 4 

char *r; // It is pointer to character . 
         // So if i increment 'r' it will increment by 1

int **q ; // if i increment q  ie.,q++ it will increment 8 bytes 

Я попробовал этот код, если что-то не так, пожалуйста, поправьте меня

int a=10; 
int *p; 
char *r; 
int **q; 
p=&a; 
q=&p; 
printf("p= %p\t r= %p\t q=%p\n",p,r,q);
 printf("p(increment)= %p\t r (increment)= %p\tq (increment)= %p ",++p,++r,++q); 

выход

 p= 0x7fff669bb1bc r= 0x7fff669bb2a0 q=0x7fff669bb1a0
 p(increment)= 0x7fff669bb1c0 r (increment)= 0x7fff669bb2a1 q (increment)= 0x7fff669bb1a8

какова роль int/char/float в двойном указателе?

3 ответа

Решение

Процитировать свойство постфикса ++ оператор, от C11, глава §6.5.2.4, Постфиксные операторы увеличения и уменьшения(выделено мной)

Результат постфикса ++ Оператор - это значение операнда. Как побочный эффект, значение объекта операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа). [...]

  • В случае int *p ;, p - указатель на тип intследовательно, приращение будет основано на sizeof(int)

  • В случае int **p ;, p - указатель на тип int *следовательно, приращение будет основано на sizeof(int *)

Ну, это зависит не только от вашей машины, но и от вашей реализации. Вы можете понять их, выполнив sizeof p, sizeof r, а также sizeof q, печать sizeof (int *), sizeof (char *), а также sizeof (int **) тоже работает

Программисты на С традиционно хотят знать много (возможно, больше, чем нужно) о базовой реализации машины.

С моей точки зрения, вам не нужно знать эти вещи, потому что компилятор справится с этим для нас (в соответствии со стандартом C) достаточно хорошо. Кроме того, большинство практик, использующих эти вещи, по сути являются неопределенным поведением.

В int **p Вы увеличиваете указатель на размер, на который он указывает (т.е. указатель). Как размер указателя 8будет увеличиваться на 8,

Последний тип здесь не играет роли. Он будет вести себя так же, как указатель на указатель на void,

Другие вопросы по тегам