Что именно 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
,