c - 指向自定义地址

标签 c pointers

我有一个奇怪的问题。考虑使用以下代码:

char *ptr = 'A';

ptr将指向地址0x41。我知道你不能直接取消引用这个指针。 如何编写一个类似的代码,使 ptr 指向由字符串创建的地址? 例如,如果我们有字符串“abc”,那么 ptr 指向的地址就是该字符串的值。 这不是我要找的:

char *ptr = "abc"

因为它会让ptr指向字符串abc所在的内存。

我们能够制作的字符串的最长长度是多少(在 32 位机器上)

最佳答案

如果您确实希望将ptr值设置为字符串文字表示的数据的位模式(在32位机器上使用四个4个字符代表4个字节) ),这就是你必须写的:

char *ptr = *((char**)"abcd");

顺便说一句:指针类型与“技巧”完全无关

int *ptr2 = *(int**)"abcd";

简短说明:像 "abcd" 这样的字符串文字在语法上被视为 char 指针(或 const char 指针)。可以使用 * 运算符取消引用指针的内容。您需要说服编译器取消引用 32 位实体,而指针就是 32 位内存模型上的此类 32 位实体。即使是 32 位值也可用于获取由 4 个 ASCII 字符构建的字符串文字表示的模式,您只需让编译器将文字视为 int (在32 位操作数机),这看起来也干净得多:

int s2i = *(int*)"ABCD"; // 0x64636261 on a Little Endian architecture

...还有另一个技巧,似乎是一些编译器:

int c2i = ((int)'ABCD'); // 0x61626364 on a Little Endian architecture

关于c - 指向自定义地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27891381/

相关文章:

对结构进行操作的函数的约定

Float 数据类型背后的概念及其赋值

c - 将带链表的归并排序从 C 翻译成 MIPS

c - 使用最少的数组查找数组组合以覆盖所有元素

C++:传递从 vector 获取的数组指针时的EXC_BAD_ACCESS

c# - 将托管字符串编码(marshal)到字符指针 c#

c - 如何通过引用传递动态分配的二维数组中的子数组?

c - 这两个指针有什么区别

c++ - 尽管缺少空终止符,为什么指向 char 的 C++ 指针仍充当字符串?

c - 使用函数指针和结构的示例程序。