char без знака — некоторые простые вопросы по C ++

Я не знаю много о C ++ (почти ничего), что означает, что я новичок в C ++.

1.

Допустим, у вас есть этот код:

typedef unsigned char u8;

С этим кодом означает ли это, что когда вы создаете переменную, вы можете написать u8 вместо unsigned char? Является ли unsigned char однобайтовым значением в диапазоне от 0 до 255 или это что-то еще?

2.

Теперь я добавлю кое-что:

typdef unsigned char u8;

u8 *someVariable;
someVariable = new u8[12345];

Какая переменная someVariable сейчас? Это список / массив с 12345 элементами, где каждая запись имеет тип u8?

3.
Добавим еще немного:

typedef unsigned char u8;

u8 *someVariable;
someVariable = new u8[12345];

someVariable+=4;

Что происходит с некоторыми переменными сейчас?
Это добавляет 4 к каждому индексу в someVariable или только к определенному? Или я совершенно не прав со списком или массивом?

2

Решение

  1. Да, вы можете написать u8 stuff; вместо unsigned char stuff;
    учитывая typedef.

    Да, это может быть от 0 до 255. Это может быть больше. Увидеть Вот

  2. В этом примере вы выделили массив (std :: list или std :: array в C ++ 11 отличаются) или символы без знака (и похоже, что delete[] их)

  3. Добавление числа к указателю повлияет на указатель, а не на то, на что он указывает, поэтому в третьем примере указатель будет перемещен вдоль четвертого элемента, но не изменит какие-либо значения.

2

Другие решения

  1. Первая часть: да. Вторая часть: не совсем. Стандарт делает все возможное, чтобы точно указать, что ему нужно. Нигде это не говорит, что char И его signed/unsigned варианты должен 8 бит, но они есть на каждой платформе, о которой вы, вероятно, заботитесь. (Если я правильно помню, char должен поддерживать по крайней мере диапазон [0,127]и может иметь то же представление, что и signed или же unsigned версия.)

  2. someVariable это указатель к массиву 12345 u8s. Фактический массив существует где-то еще (на бесплатный магазин, чаще называют куча). Если вы хотите массив «прямо здесь», вы просто пишете u8 myArray [12345];,

  3. В этом случае он перемещает указатель на массив вперед. Указатель на массив — это то же самое, что указатель на его первый элемент. Итак, теперь у вас есть указатель на 5-й элемент (они 0-indexed). Но ты не можешь delete массив через этот новый указатель.

3

1.

typedef unsigned char u8;

Это означает, что «u8» и «unsigned char» одинаковы. Вы определили новый тип (typedef) с именем u8, который определен равным unsigned char. Символ без знака равен 1 байту (C ++ определяет это как 8 или более бит) без знакового бита. В практическом плане это означает отсутствие негативов, но также и то, что определены некоторые операции, которые не определены для знакового символа.

2.

typdef unsigned char u8;

u8 *someVariable;
someVariable = new u8[12345];

someVariable — указатель на память, содержащую u8. В этом случае память, на которую он указывает, имеет место для 12345 смежных u8s. Пожалуйста, не думайте, что указатели — это то же самое, что массивы или списки, так как теперь вам будет намного легче выкинуть подобные идеи из головы.

3.

typedef unsigned char u8;

u8 *someVariable;
someVariable = new u8[12345];

someVariable+=4;

Указатель someVariable теперь указывает на другое место в памяти. Это было продвинуто 4 u8s. Значение u8, равное 1 байту, равнозначно перемещению вперед в памяти на 4 байта, если бы ваш указатель указывал на целое число без знака (обычно 4 байта), он бы переместился на 16 байтов вперед.

3

1.

typedef unsigned char u8;

typedef как псевдоним, так что вы правы. Вы можете заменить unsigned char на u8, и большая часть производственного кода будет иметь такие typedefs

беззнаковый символ 1 байт (8 бит) может содержать значения от 0 до 255.

2.
typedef unsigned char u8;

u8 *someVariable;
someVariable = new u8[12345];

someVariable — указатель с размером, скажем, 4 (зависит от операционной системы). Эта переменная будет содержать данные типа u8, либо unsigned char.

В вашем случае это массив размером 12345. Следовательно, размер некоторой переменной будет 12345 и может содержать 12345 объектов по 1 байту каждый.

  1. typedef unsigned char u8;

    u8 * someVariable;
    someVariable = new u8 [12345];

    someVariable + = 4;

здесь вы пытаетесь сделать арифметику указателя
somervariable это просто указатель. Например, допустим, что адрес некоторой переменной равен 1000, тогда + 4 переместит переменную в 1004, следовательно, * somevariable теперь приведет к значению в 1004.

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

0
По вопросам рекламы [email protected]