Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Можно ли передать адрес от числа, не создавая переменную?

#c #указатели


Пример: у меня есть ф-ция вывода на экран массива, которая принимает указатель, и
длину. Я могу, не создавая отдельной переменную, сразу передать число как аргумент?
Может я должен переделать ф-цию print, например первый параметр: const uint8_t* mass
или еще как нибудь? Я гарантирую, что ф-ция print будет только читать значения, и не
будет их менять!

#include 

using 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 #include void 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 #include using 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

Комментариев нет:

Отправить комментарий