Can you count the letter "ж" in:
Q: Можно ли передать адрес от числа, не создавая переменную? Пример: у меня есть ф-ция вывода на экран массива, которая принимает указатель, и длину. Я могу, не создавая отдельной переменную, сразу передать число как аргумент?
Может я должен переделать ф-цию print, например первый параметр: const uint8_t* mass или еще как нибудь? Я гарантирую, что ф-ция print будет только читать значения, и не будет их менять!
#include <iostream>

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;
}

Пока у меня не получилось, надеюсь на вашу помощь.

A: Поскольку вы спрашиваете с двумя тэгами - и 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; }


A: Если массив состоит из однобайтовых значений, то можно вместо символа передать строку: https://ideone.com/hP60jc
#include <stdio.h>

void print(unsigned char *a, size_t n)
{
  unsigned char *end;

  for (end=a+n; a<end; ++a)
    putchar(*a);

  putchar('\n');
}

int main()
{
  print((unsigned char*)"Q", 1);
  return 0;
}


A: У меня какой-то костыль получился, но я понятия не имею, насколько правильно так делать, и приводит ли это к UB или нет. Также обращаю внимание, что я убираю const для совместимости с вызываемой функций, чего делать не стоит. Если функция не меняет данные, её параметр уже должен быть объявлен с модификатором const, а если меняет, то с какого перепуга ей передавать указатель на rvalue?

Вопрос о наличии UB, связанного в указателем:
Продление жизни значения константной ссылкой

https://ideone.com/UTkkzK
#include <iostream>

using namespace std;

template <typename T> T * ref(const T &x) {
  return (T*)(&x);
}

void print(uint8_t *&&mass, size_t n)
{
  for (size_t q=0; q<n; ++q)
    cout << mass[q];

  cout << endl;
}

int main()
{
  print(ref((uint8_t)'Q'), 1);
  return 0;
}


user
The text includes eighteen "ж"s in total.
assistant