基指针 (C++)
__based
关键字使你能够基于指针(作为现有指针的偏移量的指针)声明指针。 __based
关键字特定于 Microsoft。
语法
type __based( base ) declarator
备注
基于指针地址的指针是 32 位或 64 位编译中唯一有效的 __based
关键字形式。 对于 Microsoft 32 位 C/C++ 编译器,基指针是相对于 32 位指针基的 32 位偏移量。 一个针对 64 位环境的类似限制保留,其中基指针是相对于 64 位基的 64 位偏移量。
基于指针的指针的用途之一是用于包含指针的永久标识符。 可将包含基于指针的指针的链接列表保存到磁盘,然后重新加载到内存中的另一个位置,并且指针保持有效。 例如:
// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
void __based( vpBuffer ) *vpData;
struct llist_t __based( vpBuffer ) *llNext;
};
将指针 vpBuffer
分配给程序中后面某个时间点分配的内存地址。 相对于 vpBuffer
的值重新定位链接的列表。
注意
还可以使用内存映射文件来保留包含指针的标识符。
当取消对基指针的引用时,必须显式指定基或通过声明隐式公开基。
为了与以前的版本兼容,_based 是 __based
的同义词,除非指定了编译器选项 /Za(禁用语言扩展)。
示例
下面的代码演示了通过更改其基来更改基指针。
// based_pointers2.cpp
// compile with: /EHsc
#include <iostream>
int a1[] = { 1,2,3 };
int a2[] = { 10,11,12 };
int *pBased;
typedef int __based(pBased) * pBasedPtr;
using namespace std;
int main() {
pBased = &a1[0];
pBasedPtr pb = 0;
cout << *pb << endl;
cout << *(pb+1) << endl;
pBased = &a2[0];
cout << *pb << endl;
cout << *(pb+1) << endl;
}
1
2
10
11
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将推出:在整个 2024 年,我们将逐步取消以“GitHub 问题”作为内容的反馈机制,并将其替换为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈