2013-09-24 8 views
2

Я не знаю много о C++ (почти ничего), то есть я noob на C++.Некоторые простые вопросы на C++

1.

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

typedef unsigned char u8; 

С помощью этого кода, это означает, что при создании переменной вы можете написать U8 вместо неподписанные символ? Является ли 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; 

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

+0

Это домашнее задание? – doctorlove

+0

Нет, это не домашнее задание. – user2746752

ответ

2
  1. Да, вы можете написать u8 stuff; вместо unsigned char stuff; учитывая ЬурейеЕ. Да, оно может варьироваться от 0 до 255. Оно может быть больше. См here

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

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

+0

Спасибо, ответ на вопрос 3 означает, что когда я использую someVariable [0], я получаю пятый u8 вместо первого? – user2746752

+1

someVariable [0] - первый, да – doctorlove

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

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

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

3

1.

typedef unsigned char u8; 

Это означает, что "u8" и "неподписанные символ" являются одинаковыми. Вы определили новый тип (typedef), называемый u8, который определен равным unsigned char. 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 байта, если ваш указатель указывал на unsigned int (обычно 4 байта), он переместил бы вперед 16 байт.

0

1.

typedef unsigned char u8; 

ЬурейеЕ, как псевдоним, так что вы правы. Можно заменить символ без знака, чтобы u8 и большую часть кода производства будет иметь такие

определений типов

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

2. ЬурейеЕ символ без знака u8;

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

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

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

  1. typedef unsigned char u8;

    u8 * someVariable; someVariable = новый u8 [12345];

    someVariable + = 4;

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

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

Смежные вопросы