Разница между int * i и int ** i - PullRequest
       11

Разница между int * i и int ** i

8 голосов
/ 25 сентября 2010

В чем разница между int* i и int** i?

Ответы [ 12 ]

23 голосов
/ 25 сентября 2010

Указатель на целое значение

int* i


Указатель на указатель на целочисленное значение

int** i

(т. Е. Во втором случае вам потребуется две разыменования для доступа к значению целого числа)

9 голосов
/ 25 сентября 2010
  • int* i: i - указатель на объект типа int
  • int** i: i - указатель на указатель на объект типа int
  • int*** i: i - указатель на указатель на указатель на объект типа int
  • int**** i: i - указатель на указатель на указатель на указатель на объект типа int
  • ...
8 голосов
/ 25 сентября 2010

int * pi

pi - указатель на целое число

int ** ppi

ppi - указатель на указатель на целое число.

РЕДАКТИРОВАТЬ :

Вам нужно прочитать хорошую книгу по указателям. Я рекомендую Указатели на C от Кеннета Рика .

6 голосов
/ 25 сентября 2010

Не думаю, что это относится к opencv.

int *i объявляет указатель на int. Таким образом, i хранит адрес памяти, и C ожидает, что содержимое этого адреса памяти будет содержать int.

int **i объявляет указатель на ... указатель. Для инт. Таким образом, i содержит адрес, и по этому адресу памяти C ожидает увидеть другой указатель. Этот второй адрес памяти, следовательно, будет содержать int.

Обратите внимание, что пока вы объявляете указатель на int, фактическое int не выделяется. Так что допустимо сказать int *i = 23, что говорит: «У меня есть переменная, и я хочу, чтобы она указала на адрес памяти 23, который будет содержать int». Но если бы вы попытались на самом деле читать или записывать на адрес памяти 23, вы бы, вероятно, segfault, поскольку ваша программа не «владеет» этим фрагментом оперативной памяти. *i = 100 будет сегфо. (Решение состоит в том, чтобы использовать malloc (). Или вы можете сделать так, чтобы он указывал на существующую переменную, как в int j = 5; int *i = &j)

3 голосов
/ 25 сентября 2010

Я глубоко верю, что картина стоит тысячи слов.Возьмите следующий пример

// Finds the first integer "I" in the sequence of N integers pointed to by "A" . 
// If an integer is found, the pointer pointed to by P is set to point to 
// that integer. 
void f(int N, int *A, int I, int **P) {
  for(int i = 0; i < N; i++)
    if(A[i] == I) {
      // Set the pointer pointed to by P to point to the ith integer.
      *P = &A[i];
      return;
    } 
}

Итак, в приведенном выше примере A указывает на первое целое число в последовательности из N целых чисел.И P указывает на указатель, в котором у вызывающего абонента будет храниться указатель на найденное целое число.

int Is[] = { 1, 2, 3 };

int *P;
f(3, &Is[0], 2, &P);
assert(*P == 2);

&P используется для передачи адреса P функции.Этот адрес имеет тип int **, потому что это адрес указателя на int.

3 голосов
/ 25 сентября 2010

Представьте, что у вас есть несколько друзей, один из которых должен вам что-то дать (сокровище ... :-) Скажи, что у Джона есть сокровище

int treasure = 10000; // in USD, EUR or even better, in SO rep points

Если вы прямо спросите Джона

int john = treasure;
int you = john;

Если вы не можете присоединиться к Джону, но Джилл знает, как с ним связаться,

int john = treasure;
int *gill = &john;
int you = *gill;

Если вы не можете даже присоединиться к Джилу, но должны связаться с первым Джейком, который может связаться с Джиллом

int john = treasure;
int *gill = &john;
int **jake = &gill;
int you = **jake;

И т.д. ... Указатели - это только косвенные указания.

Это была моя последняя история на сегодня перед сном: -)

2 голосов
/ 25 сентября 2010

Допустим, вы учитель и должны делать заметки одному из ваших учеников.

int note;

Хорошо ... Я имел в виду весь класс

int *class_note; /* class_note[0]: note for Adam; class_note[1]: note for Brian; ... */

Хорошо... не забывайте, что у вас есть несколько классов

int **classes_notes; /* classes_notes[0][2]: note for Charles in class 0; ... */

И вы также преподаете в нескольких учреждениях

int ***intitute_note; /* institute_note[1][1][1]: note for David in class 1 of institute 1 */

и т. д., и т. д. *

1 голос
/ 25 сентября 2010

int * i - адрес ячейки памяти целого числа
int ** - адрес ячейки памяти, адрес ячейки памяти целого числа

1 голос
/ 25 сентября 2010

Также не является декларацией.Синтаксис объявления не допускает () вокруг всего объявления.Что эти () делают там?Если предполагается, что это является частью объявления функции, включите в свой вопрос всю функцию объявления функции, поскольку в общем случае фактическое значение объявления может зависеть от этого.(Не в этом, хотя.)

Что касается разницы ... Есть один * в первом и два * во втором.Это помогает?Возможно нет.Первый объявляет i как указатель на int.Второй объявляет i как указатель на int *.Это помогает?Наверное, не так много.Без более конкретного вопроса трудно дать более значимый ответ.

Укажите больше контекста, пожалуйста.Или, если это на самом деле настолько конкретно, насколько это возможно, прочитайте свою любимую книгу по указателям на C или C ++.Такие широкие общие вопросы - это не то, что вы задаете в сети.

0 голосов
/ 27 сентября 2010

int * i; // я указатель на целое число. Может содержать адрес целочисленной переменной.

int ** i; // я - указатель на указатель на целое число. Может содержать адрес переменной целочисленного указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...