一些简单的C++问题

Some Simple C++ Questions

本文关键字:C++ 问题 简单      更新时间:2023-10-16

我对C++了解不多(几乎一无所知(,这意味着我是一个C++菜鸟。

1.

假设您有以下代码:

typedef unsigned char u8;

使用此代码,是否意味着当您创建变量时,您可以编写 u8 而不是无符号字符?无符号字符是介于 0 到 255 之间的一个字节值还是其他值?

阿拉伯数字。

现在我添加一些东西:

typdef unsigned char u8;
u8 *someVariable;
someVariable = new u8[12345];

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

3.添加更多:

typedef unsigned char u8;
u8 *someVariable;
someVariable = new u8[12345];
someVariable+=4;

现在某个变量会发生什么?它是将 4 添加到某个变量中的每个索引还是只添加到某个索引?还是我对列表或数组的东西完全错误?

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

  2. someVariable 是指向 12345 u8 s 数组的指针。实际数组存在于其他地方(在免费商店中,通常称为(。如果你想要数组"就在这里",你只需写u8 myArray [12345];.

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

1.

typedef unsigned char u8;

这意味着"u8"和"无符号字符"是相同的。您已经定义了一个名为 u8 的新类型 (typedef(,该类型定义为等于无符号字符。无符号字符是 1 个字节(C++将其定义为 8 位或更多(,没有符号位。实际上,这意味着没有负数,但也定义了某些未为签名字符定义的操作。

阿拉伯数字。

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 个 u8。u8 是 1 个字节,这与在内存中向前移动 4 个字节相同,如果您的指针指向一个无符号的 int(通常为 4 个字节(,它将向前移动 16 个字节。

  1. 是的,您可以写 u8 stuff; 而不是 unsigned char stuff; 给定类型定义。是的,它的范围可能介于 0 到 255 之间。它可能会更大。看这里

  2. 在这个例子中,你分配了一个数组(std::list 或 C++11 的 std::array 是不同的(或无符号字符(并且似乎没有delete[]它们(

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

1.

typedef unsigned char u8;

typedef就像别名,所以你是对的。您可以将无符号字符替换为 u8,大多数生产代码都会有这样的 typedef

无符号字符为 1 个字节(8 位(,可以保存 0 到 255 之间的值。

阿拉伯数字。 typedef unsigned char u8;

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

someVariable是一个大小为4的指针(取决于操作系统(。此变量将保存 u8 类型的数据,可以是无符号字符。

在您的情况下,它是一个大小为 12345 的数组。因此,某个变量的大小将是 12345,可以容纳 12345 个对象,每个对象 1 个字节。

  1. typedef unsigned char u8;

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

    某些变量+=4;

在这里,您正在尝试进行指针运算SomerVariable只是一个指针。例如,假设某个变量的地址是 1000,那么 + 4 会将变量移动到 1004,因此 *somevariable 现在将导致值为 1004。

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