2

我对 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;

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

4

4 回答 4

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

  2. someVariable指向s数组的指针12345 u8。实际的数组存在于其他地方(在free store上,通常称为heap)。如果你想要数组“就在这里”,你只需写u8 myArray [12345];.

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

于 2013-09-24T15:46:27.350 回答
3

1.

typedef unsigned char u8;

这意味着“u8”和“unsigned char”是相同的。您已经定义了一个名为 u8 的新类型 (typedef),它的定义等于 unsigned char。无符号字符是 1 个字节(C++ 将其定义为 8 位或更多),没有符号位。实际上,这意味着没有负面影响,而且还定义了一些未为有符号字符定义的操作。

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 字节。

于 2013-09-24T15:47:51.570 回答
2
  1. 是的,您可以编写 u8 stuff; 而不是 unsigned char stuff; 给定 typedef。是的,它的范围可能从 0 到 255。它可能更大。看这里

  2. 在此示例中,您分配了一个数组(std::list 或 C++11 的 std::array 不同)或无符号字符(他们似乎没有delete[]

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

于 2013-09-24T15:46:11.123 回答
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 无符号字符 u8;

    u8 *一些变量;someVariable = 新 u8[12345];

    一些变量+=4;

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

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

于 2017-04-29T05:37:46.817 回答