【发布时间】:2014-02-26 19:55:18
【问题描述】:
#include <stdio.h>
const char *c = "hello";
const char *cp = (unsigned char*)&c;
const char *cpp = (unsigned char*)&cp;
int main (){
printf("PTR c %p \n",c);
printf("PTR cp %p \n",cp);
printf("PTR cpp %p \n",cpp);
printf("\n\n");
printf("CONTENTS cp 0x%x \n",*(unsigned int*)cp);
printf("CONTENTS cpp 0x%x \n",*(unsigned int*)cpp);
printf(" \n\n Demonstrating pointer arithmetic. \n\n");
printf("PTR c %p \n ",c);
printf("PTR (c+1) %p \n ",(c+1));
printf("PTR c %p \n ",(unsigned int*)c);
printf("PTR (c+1) %p \n ",(unsigned int*)(c+1));
printf("PTR c %p \n ",(unsigned long*)c);
printf("PTR (c+1) %p \n ",(unsigned long*)(c+1));
return 0;
}
程序的输出如下所示
PTR c 0x4007a0
PTR cp 0x601028
PTR cpp 0x601030
CONTENTS cp 0x4007a0
CONTENTS cpp 0x601028
Demonstrating pointer arithmetic.
PTR c 0x4007a0
PTR (c+1) 0x4007a1
PTR c 0x4007a0
PTR (c+1) 0x4007a1
PTR c 0x4007a0
PTR (c+1) 0x4007a1
如果您查看演示指针算法部分,我会期待以下结果
1) 前两行打印 'char pointers' 分开一个地址,因此差异应该是 '1' - 这就是我们得到的
2) 接下来的两行打印 'int pointers' 相隔一个地址,因此差异应该是 '4' - 出了什么问题??
3) 接下来的两行打印 'long pointers' 相隔一个地址,因此差异应该是 '4/8' - 出了什么问题??
【问题讨论】:
-
当你执行
&c时,你会得到一个指向c的指针,所以&c是一个指向const char的指针。 -
我认为你在施法之前会增加
-
这段代码绝对是疯了。
const char *cpp = (unsigned char*)&cp;毫无意义。 -
@Mooing Duck - 为什么不呢?
-
获取
const char*,获取该地址(const char**),将其显式转换为unsigned char*(这是危险且毫无意义的),然后隐式将其转换为@ 987654331@(同样危险且毫无意义)。看起来您想要的是const char** cpp = &cp;提示:如果您在 C++ 中有类型转换,那么您的代码可能是错误的。