использование указателей при передаче в качестве аргумента - PullRequest
2 голосов
/ 05 октября 2011

У меня есть несколько концептуальных проблем в понимании кода. Ниже приведено описание

char dest[100];
char *info;

Byte *ie;

Объявление функции говорит:

getValue(Byte tag, Byte *msg, int len)

мы передаем что-то вроде

getValue(0X01, &info[4], 30);

здесь я понимаю, что передаю адрес значений указателю.

Теперь есть вторая функция

retriveValue( Byte *ie, Byte *digits, Byte totalLen)

, в этой функции мы передаем что-то вроде

retriveValue(&ie[3], (Byte*)&dest, 2);  

Здесь, я думаю, мы конвертируем char в указатель типа byte и передаем ему Address.

Теперь мой вопрос:

  1. Что плохого, если я преобразую dest в байт и передам адрес, например (Byte)&dest?
  2. Как бы я прошел, если destтипа char* как например char *dest;?

Ответы [ 2 ]

1 голос
/ 05 октября 2011
retriveValue(&ie[3], (Byte*)&dest, 2);  

здесь, во 2-м аргументе, вы взяли адрес dest и затем указатель привел его к (Byte *)

1> Что не так, если я преобразовал dest в байт и передал адрес как(Байт) & dest?

, делая это, вы переводите адрес dest в байт (не байт-указатель)

2> Как бы я прошел, если destтипа char * как например например char * dest;?

, тогда нет необходимости добавлять "&", просто напишите

retriveValue(&ie[3], (Byte*)dest, 2);  
0 голосов
/ 05 октября 2011

"мы пропускаем что-то вроде"

getValue(0X01, &info[4], 30);

О, теперь ты?Потому что там создается страшное количество плохой кармы.

Во-первых, передача шестнадцатеричных значений немного странная.Вы можете передать константу или значение #defined, например, TAG_01.В вашем приложении это может быть совершенно нормально, но я буду осторожен.

Второй аргумент - это когда становится страшно.info - это указатель (предположительно установленный в & dest), значение, которое содержит информация, является адресом объекта, на который вы указываете.Если вы хотите передать адрес, вы должны указать на объект, а затем передать информацию без амперсанда или обработки его как массива.Что вы делаете, используя квадратные скобки [], чтобы получить элемент dest, а затем получить адрес этого.

Теперь, возможно, вы используете указатели каким-то оригинальным способом, и вы действительно хотите ссылаться на 4-й байт после него.Но я сомневаюсь в этом.Вы, вероятно, просто копаетесь с указателями, чтобы увидеть, как они работают, и это хорошо.Но когда вы начинаете делать вещи, если вы хотите передать сообщение, объявите сообщение и отправьте его.Не вставляйте символьную строку в часть большего массива.Это плохая форма.Вместо этого используйте структуру.

здесь я понимаю, что я передаю адрес значений указателю.

Ну, вы передаете адрес функции, а не указателю.


"в этой функции мы передаем что-то вроде"

retriveValue(&ie[3], (Byte*)&dest, 2);  

Опять же, я в холодном поту из-за того, как это страшно неправильно.Никогда не делай этого.О ком это гнусное «мы», о котором ты говоришь?Являетесь ли вы частью какого-то ужасного культа, воспевающего неописуемый диалект С в попытке установить темное правление Ктулу?H̡e͜͟ ͟c̀om͠e̴͝? ̢̛͟

В любом случае, культ в стороне,
Что плохого, если я преобразую dest в байты и передаю адреса как (Byte) & dest?

AsМесье 32 указал, что вы не передаете адрес, если вы делаете это, вы передаете байт.Помните, что длина байта составляет 8 бит.Это один символ.Адрес обычно составляет 32 или 64 бита, в зависимости от среды.Поэтому, когда вы приводите его таким образом, вы отбрасываете 3/4 нужных вам данных, и это не соответствует определению функции.И это грех против природы.

Как бы я прошел, если dest имеет тип char *, например, для char * dest;?
Да, просто dest, все обычное и ванильное.Это потому что dest не символ.Он объявлен как dest[100], что означает, что dest[0] является символом, но dest является адресом dest[0], как указатель.

Соглашение о массиве - это всего лишь небольшая часть указателей, чтобы помочьдержать вещи прямо.Функциональной разницы между *(dest+3) и dest[3] нет.На техническом уровне массивы и указатели отличаются в том смысле, что объявления массивов, такие как dest, будут рассматриваться как const во время компиляции, поэтому это не будет занимать ОЗУ.Указатель char * будет иметь свой собственный небольшой объем оперативной памяти, который вы можете увеличивать при циклическом просмотре ваших данных, но только темный всегда использует такие указатели.Почему он спит?Бесконечный цикл, потому что он не правильно использовал свои указатели.

Наконец, если вы уже приняли ответ г-на 32, который был НАИБОЛЕЕ впереди моего, вам действительно следует вернуть его обратно.И просто скажи нет мертвым инопланетным богам.

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