一些简单的C++问题
Some Simple C++ Questions
我对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 添加到某个变量中的每个索引还是只添加到某个索引?还是我对列表或数组的东西完全错误?
-
第一部分:是的。第二部分:不完全是。该标准不遗余力地指定了它的需求。没有任何地方说
char
及其signed
/unsigned
变体必须是8位,但它们在您可能关心的每个平台上。(如果我没记错的话,char
必须至少支持范围[0,127]
,并且可以与其signed
或unsigned
版本共享相同的表示形式。 -
someVariable
是指向12345
u8
s 数组的指针。实际数组存在于其他地方(在免费商店中,通常称为堆(。如果你想要数组"就在这里",你只需写u8 myArray [12345];
. -
在这种情况下,它将指向数组的指针向前移动。指向数组的指针与指向其第一个元素的指针基本相同。所以现在你有一个指向第 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 个字节。
-
是的,您可以写
u8 stuff;
而不是unsigned char stuff;
给定类型定义。是的,它的范围可能介于 0 到 255 之间。它可能会更大。看这里 -
在这个例子中,你分配了一个数组(std::list 或 C++11 的 std::array 是不同的(或无符号字符(并且似乎没有
delete[]
它们( -
向指针添加数字将影响指针,而不是指针指向的内容,因此第三个示例会将指针移动到第四项,但不会更改任何值。
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 个字节。
typedef unsigned char u8;
u8 *someVariable;someVariable = new u8[12345];
某些变量+=4;
在这里,您正在尝试进行指针运算SomerVariable只是一个指针。例如,假设某个变量的地址是 1000,那么 + 4 会将变量移动到 1004,因此 *somevariable 现在将导致值为 1004。
实际上,不建议在不将起始地址存储在某个临时变量中的情况下移动指针。 原因 - 经过几次指针运算后,我们可能会失去对起始位置的跟踪,因此我们可能会指向一些导致崩溃的不相关地址。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题