一些简单的C ++问题

时间:2013-09-24 15:36:56

标签: c++ unsigned-char

我对C ++知之甚少(几乎没有),这意味着我是C ++的菜鸟。

1

假设你有这段代码:

typedef unsigned char u8;

使用此代码,是否意味着在创建变量时可以编写u8而不是unsigned char?无符号字符是一个字节值,范围从0到255还是其他什么?

2

现在我添加一些内容:

typdef unsigned char u8;

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

变量some​​Variable现在是什么?它是一个包含12345个项目的列表/数组,其中每个条目都是u8类型吗?

3。 再添加一些:

typedef unsigned char u8;

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

someVariable+=4;

现在某些变量会发生什么? 它是为someVariable中的每个索引添加4还是仅添加到某个?或者我对列表或数组的事情完全错了?

4 个答案:

答案 0 :(得分:3)

  1. 第一部分:是的。第二部分:不完全是。标准不遗余力地明确指出它需要什么。没有任何地方说char及其signed / unsigned变体必须为8位,但它们位于您可能关心的每个平台上。 (如果我没记错的话,char 必须支持至少[0,127]范围,并且可以与其signedunsigned共享相同的表示形式版本)。

  2. someVariable是指向12345 u8数组的指针。实际的数组存在于其他地方(在免费商店上,通常称为)。如果您希望数组“就在这里”,则只需编写u8 myArray [12345];

  3. 在这种情况下,它将指针向前移动到数组。指向数组的指针与指向其第一个元素的指针基本相同。所以现在你有一个指向第5个元素的指针(它们是0 - 索引)。但你不能通过这个新指针delete数组。

答案 1 :(得分:3)

1

typedef unsigned char u8;

这意味着“u8”和“unsigned char”是相同的。您已经定义了一个名为u8的新类型(typedef),它被定义为等于unsigned char。 unsigned char是1个字节(C ++定义为8位或更多位),没有符号位。实际上,这意味着没有否定,但也定义了一些未为signed char定义的操作。

2

typdef unsigned char u8;

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

someVariable是指向存放u8的内存的指针。在这种情况下,它指向的内存有12345个连续u8的空间。请不要开始认为指针与数组或列表相同,它会更好地为您提供更好的想法。

3

typedef unsigned char u8;

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

someVariable+=4;

指针someVariable现在指向内存中的不同位置。它被推进了4 u8s。 u8为1字节,这与在内存中向前移动4字节相同,如果指针指向无符号整数(通常为4字节),它将向前移动16字节。

答案 2 :(得分:2)

  1. 是的,你可以写 u8 stuff; 代替 unsigned char stuff; 给出typedef。 是的,它可能介于0到255之间。它可能更大。请参阅here

  2. 在这个例子中你已经分配了一个数组(std :: list或者C ++ 11的std :: array是不同的)或者是unsigned chars(似乎delete[]不是这样的)

  3. 向指针添加数字会影响指针,而不是它指向的指针,因此第三个示例将指针移动到第四个项目,但不会更改任何值。

答案 3 :(得分:0)

1

typedef unsigned char u8;

typedef就像是别名,所以你是对的。您可以将unsigned char替换为u8,并且大多数生产代码都将具有此类typedef

unsigned char是1个字节(8位),可以保存0到255之间的值。

2。     typedef unsigned char 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 = new u8 [12345];

    someVariable + = 4;

  2. 这里你试图做指针算术 somervariable只是一个指针。例如,假设某个变量的地址为1000,那么+ 4会将变量移动到1004,因此* somevariable现在将导致值为1004。

    实际上不建议在不将起始地址存储在某个临时变量中的情况下移动指针。原因 - 在几个指针算术之后,我们可能会松开跟踪起始位置,因此我们可能指向一些不相关的地址导致崩溃。