UE 中常见容器获取指针的方法

TArray

  • 使用 GetData()&Array[0] 获取连续内存指针。

TSetTMap

  • 不支持直接获取连续内存指针,需通过迭代器访问元素。

FStringFNameFText

  • 通过相应的方法获取内部字符串指针,如 GetData()Get() 等。

FBufferArchive

  • 使用 GetData() 获取缓冲区指针。(新手可暂时忽略,了解其用途即可)

FMemoryReaderFMemoryWriter

  • 用于在内存中读写数据,常与 TArray<uint8> 结合使用。

1. TArrat(动态数组)

获取数据指针的方法:

  • GetData()
    • 作用:返回指向数组中第一个元素的指针。
    • 示例
        TArray<int32> MyArray = {1, 2, 3, 4};
        int32* Ptr = MyArray.GetData();
  • &MyArray[0]
    • 作用:通过获取数组第一个元素的地址来获取指针(前提是数组不为空)。
    • 示例
     if (MyArray.Num() > 0)
    {
      int32* Ptr = &MyArray[0];
    }

2. Tset(集合)

获取数据指针的方法:

  • 直接获取指针不可行
    • TSet 不像 TArray 那样提供连续的内存存储,因此无法直接获取整个集合的指针。建议使用智能指针进行管理。
  • 使用迭代器访问元素
    • 示例
 #include "Containers/Set.h"
 #include "Templates/SharedPointer.h"
 #include "Logging/LogMacros.h"

// 在某个函数中执行以下代码
void ExampleFunction()
{
    // 创建一个存储 TSharedPtr<int32> 的 TSet
    TSet<TSharedPtr<int32>> MySet;

    // 创建并添加智能指针到集合中
    TSharedPtr<int32> Num1 = MakeShareable(new int32(1));
    TSharedPtr<int32> Num2 = MakeShareable(new int32(2));
    TSharedPtr<int32> Num3 = MakeShareable(new int32(3));
    TSharedPtr<int32> Num4 = MakeShareable(new int32(4));

    MySet.Add(Num1);
    MySet.Add(Num2);
    MySet.Add(Num3);
    MySet.Add(Num4);

    // 遍历集合并访问每个元素
    for (const TSharedPtr<int32>& ElementPtr : MySet)
    {
        if (ElementPtr.IsValid())
        {
            UE_LOG(LogTemp, Warning, TEXT("当前元素的值: %d"), *ElementPtr);
        }
    }
}

3. TMap(键值对映射)

获取数据指针的方法:

  • 直接获取指针不可行
    • 类似于 TSetTMap 也不提供连续内存存储,无法直接获取整个映射的指针。
  • 使用迭代器访问键值对
    • 示例

TMap MyMap;
MyMap.Add(TEXT(“One”), 1);
MyMap.Add(TEXT(“Two”), 2);

for (const TPair& Pair : MyMap)
{
// 访问每个键值对,例如 Pair.Key 和 Pair.Value
}


4. FString(字符串)

获取字符指针的方法:

  • GetCharArray().GetData()
    • 作用:获取 FString 内部字符数组的指针(包括结束符 \0)。
    • 示例

FString MyString = TEXT(“Hello”);
TCHAR* Ptr = MyString.GetCharArray().GetData();

  • operator*Get()
    • 作用:获取指向字符串数据的指针。
    • 示例

FString MyString = TEXT(“Hello”);
const TCHAR* Ptr = *MyString; // 或 MyString.Get()


5. FName(名称)

获取名称字符串指针的方法:

  • GetPlainNameString()
    • 作用:返回名称的 FString 表示,可以进一步获取指针。
    • 示例

FName MyName = TEXT(“ExampleName”);
FString NameString = MyName.GetPlainNameString();
const TCHAR* Ptr = *NameString;


6. FText(本地化文本)

获取文本字符串指针的方法:

  • ToString()
    • 作用:将 FText 转换为 FString,然后获取指针。
    • 示例

FText MyText = FText::FromString(TEXT(“Localized Text”));
FString TextString = MyText.ToString();
const TCHAR* Ptr = *TextString;


7. FBufferArchive(二进制缓冲区)

获取缓冲区指针的方法:

  • GetData()
    • 作用:返回缓冲区中数据的指针。
    • 示例

FBufferArchive Buffer;
Buffer.AddUninitialized(100);
uint8* Ptr = Buffer.GetData();

提示

FBufferArchive 是 UE 中用于处理二进制数据的一种工具,通常用于序列化数据或将数据写入文件。作为新手,可以先了解它的基本用途,实际项目中逐步深入学习其具体用法。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注