Я не знаю много о 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 или только к определенному? Или я совершенно не прав со списком или массивом?
Да, вы можете написать u8 stuff;
вместо unsigned char stuff;
учитывая typedef.
Да, это может быть от 0 до 255. Это может быть больше. Увидеть Вот
В этом примере вы выделили массив (std :: list или std :: array в C ++ 11 отличаются) или символы без знака (и похоже, что delete[]
их)
Добавление числа к указателю повлияет на указатель, а не на то, на что он указывает, поэтому в третьем примере указатель будет перемещен вдоль четвертого элемента, но не изменит какие-либо значения.
Первая часть: да. Вторая часть: не совсем. Стандарт делает все возможное, чтобы точно указать, что ему нужно. Нигде это не говорит, что char
И его signed
/unsigned
варианты должен 8 бит, но они есть на каждой платформе, о которой вы, вероятно, заботитесь. (Если я правильно помню, char
должен поддерживать по крайней мере диапазон [0,127]
и может иметь то же представление, что и signed
или же unsigned
версия.)
someVariable
это указатель к массиву 12345
u8
s. Фактический массив существует где-то еще (на бесплатный магазин, чаще называют куча). Если вы хотите массив «прямо здесь», вы просто пишете u8 myArray [12345];
,
В этом случае он перемещает указатель на массив вперед. Указатель на массив — это то же самое, что указатель на его первый элемент. Итак, теперь у вас есть указатель на 5-й элемент (они 0
-indexed). Но ты не можешь delete
массив через этот новый указатель.
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 байтов вперед.
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 байту каждый.
typedef unsigned char u8;
u8 * someVariable;
someVariable = new u8 [12345];
someVariable + = 4;
здесь вы пытаетесь сделать арифметику указателя
somervariable это просто указатель. Например, допустим, что адрес некоторой переменной равен 1000, тогда + 4 переместит переменную в 1004, следовательно, * somevariable теперь приведет к значению в 1004.
практически не рекомендуется перемещать указатели без сохранения начального адреса в некоторой временной переменной. причина — после нескольких арифметических операций с указателями мы можем потерять отслеживание начального местоположения и, следовательно, мы можем указывать на какой-то нерелевантный адрес, вызывающий сбой.