#c #указатели
Пример: у меня есть ф-ция вывода на экран массива, которая принимает указатель, и длину. Я могу, не создавая отдельной переменную, сразу передать число как аргумент? Может я должен переделать ф-цию print, например первый параметр: const uint8_t* mass или еще как нибудь? Я гарантирую, что ф-ция print будет только читать значения, и не будет их менять! #includeusing namespace std; void print(uint8_t * mass, uint16_t len) { uint16_t i; for (i = 0; i < len; i++) { cout << mass[i]; } cout << endl; } int main() { print(&((uint8_t)0),1); return 0; } Пока у меня не получилось, надеюсь на вашу помощь.
Ответы
Ответ 1
Если массив состоит из однобайтовых значений, то можно вместо символа передать строку: https://ideone.com/hP60jc #includevoid print(unsigned char *a, size_t n) { unsigned char *end; for (end=a+n; a Ответ 2
Поскольку вы спрашиваете с двумя тэгами - и C, и C++, не буду рассказывать, что такое rvalue, lvalue и прочие (но рекомендую самому поинтересоваться). А вам просто задам вопрос - просто число - это какое-то значение, которое может быть просто записано в команде процессору - ну, например, mov eax, 0 т.е. этот ноль - это просто байты не в данных, а в выполнимом коде - вы считаете, что этот адрес, приходящийся на средину команды, может что-то дать полезное? При том, что обращаться к коду - это в общем случае запрещено? Или это может быть значение в регистре процессора - как вы себе представляете его адрес? Опять же, представим вызов - f(&1,&1,&1) - это три разных адреса единиц или один и тот же? Поэтому в общем случае - нет, адрес числа вообще - это нонсенс. Что бы вы ни получили в качестве корректного адреса и каким путем - это будет переменная, содержащая нужное вам значение, пусть даже она будет временная и безымянная. Очень хромой костыль: char * addr(char q) { static char c; c = q; return &c; } void print(char * a) { printf("[%c]\n",*a); } int main() { print(addr('Q')); } Но он мне активно не нравится :) И это уж точно не "адрес числа", а адрес статической переменной в другой функции... Но руками создавать переменную при этом не приходится. Еще вариант - раз уж все равно устраивает написание дополнительных функций :) void print(char * a); void printChar(char a) { print &a; }Ответ 3
У меня какой-то костыль получился, но я понятия не имею, насколько правильно так делать, и приводит ли это к UB или нет. Также обращаю внимание, что я убираю const для совместимости с вызываемой функций, чего делать не стоит. Если функция не меняет данные, её параметр уже должен быть объявлен с модификатором const, а если меняет, то с какого перепуга ей передавать указатель на rvalue? Вопрос о наличии UB, связанного в указателем: Продление жизни значения константной ссылкой https://ideone.com/UTkkzK #includeusing namespace std; template T * ref(const T &x) { return (T*)(&x); } void print(uint8_t *&&mass, size_t n) { for (size_t q=0; q
Комментариев нет:
Отправить комментарий