Как передать указатель на функцию - PullRequest
1 голос
/ 11 декабря 2010

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

Однако, когда я передаю его, адрес, похоже, меняется.

Указатели являются переменными-членами.

В основном я делаю это:

unsigned char array[1000];
unsigned char * pointer = array;
printf("p%", &pointer);

setup(pointer);

void setup(unsigned char* pointer){
  unsigned char * p = pointer;
  printf("p%", &p);
}

Ответы [ 9 ]

3 голосов
/ 11 декабря 2010

&pointer находит адрес указателя, а не адрес массива. Вы просто хотите printf("%p", pointer);.

3 голосов
/ 11 декабря 2010

Вы печатаете адрес переменной указателя. В первом случае это адрес pointer в качестве локальной переменной, а во втором - адрес pointer в качестве аргумента функции. Логически они имеют разные адреса, хотя их значение одинаково, то есть адрес array. Вам нужно удалить & из вашего printfs.

1 голос
/ 11 декабря 2010
unsigned char * pointer = array;
printf("%p", &pointer);

Вы не печатаете адрес array здесь; вы печатаете адрес pointer. содержимое из pointer представляет адрес из array, поэтому я думаю, что вы нужно printf("%p", pointer); здесь.

1 голос
/ 11 декабря 2010
unsigned char array[1000];
Unsigned char * pointer = array;
printf("p%", &pointer);

Вы печатаете адрес переменной 'pointer'.

Setup(pointer);

Вы передаете переменную 'pointer' по значению в 'Setup'.

Void setup(unsigned char* pointer){

Вы приняли переменную по значению с именем 'pointer', поэтому она была создана для вас и инициализирована значением, с которым была вызвана функция.

Unsigned char * p = pointer;

Вы создали еще одну переменную с именем 'p ', которое инициализируется тем же значением, которое содержится в указателе.

printf("p%", &p);

Вы печатаете адрес этой новой переменной.Конечно, он находится в другом месте в памяти, потому что это не та переменная, которую вы напечатали в первый раз.

}

Пожалуйста, просмотрите эту статью: http://crazyeddiecpp.blogspot.com/2010/12/pet-peeve.html

1 голос
/ 11 декабря 2010

Вы печатаете адрес недавно выделенного символа * p, не так ли?

0 голосов
/ 11 декабря 2010
setup(&pointer);//pass with its address

void setup(unsigned char** pointer){// make one for address, one for array
    ...
}
0 голосов
/ 11 декабря 2010

pointer и p являются отдельными переменными и поэтому будут иметь разные адреса, несмотря на то, что они указывают на одно и то же место.Возможно, вы хотели использовать оператор разыменования * вместо адресного оператора &.

Если вы хотите убедиться, что они оба указывают натот же адрес памяти, что вы должны выводить сами указатели, а не адреса этих указателей.

Например:

printf("%p", pointer);
0 голосов
/ 11 декабря 2010

Здесь есть много хороших ответов, но, на мой взгляд, ни один из них действительно не иллюстрирует важную концепцию, состоящую в том, что переменные обычно передаются по значению в C ++, если не указано иное.

В вашей функции "setup" вы фактически запрашиваете адрес указателя, а не адрес массива (который содержит указатель.) Поскольку этот указатель был передан вашей функции по значению, он копия вашего оригинального указателя. Вот почему он имеет другой адрес.

0 голосов
/ 11 декабря 2010

Вы создаете новую переменную, а затем получаете ее адрес.

Вам нужен адрес оригинала pointer в аргументах.

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