C 试图理解指针算法
如果你看一下演示指针算法的部分,我希望得到以下结果 1) 前两行分别打印一个地址的“char pointers”,因此差异应该是“1”-这就是我们得到的结果 2) 接下来的两行分别打印一个地址的“int pointers”,因此差异应该是“4”-出了什么问题C 试图理解指针算法,c,pointers,C,Pointers,如果你看一下演示指针算法的部分,我希望得到以下结果 1) 前两行分别打印一个地址的“char pointers”,因此差异应该是“1”-这就是我们得到的结果 2) 接下来的两行分别打印一个地址的“int pointers”,因此差异应该是“4”-出了什么问题 3) 接下来的两行分别打印一个地址的“长指针”,因此差异应该是“4/8”-出了什么问题???在将值转换为所需指针之前,您正在增加值 要将“c”解释为另一个指针,您应该 PTR c 0x4007a0 PTR cp
3) 接下来的两行分别打印一个地址的“长指针”,因此差异应该是“4/8”-出了什么问题???在将值转换为所需指针之前,您正在增加值 要将“c”解释为另一个指针,您应该
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
否则,括号将优先考虑在施法之前的增量
如果没有这些括号,则强制转换的优先级高于加法,如下所示
printf("PTR (c+1) %p \n ",(unsigned int*)c+1);
这相当于
item = (char*)heap + offset;
参考:优先级表在将值强制转换为所需指针之前,您正在递增这些值 要将“c”解释为另一个指针,您应该
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
否则,括号将优先考虑在施法之前的增量
如果没有这些括号,则强制转换的优先级高于加法,如下所示
printf("PTR (c+1) %p \n ",(unsigned int*)c+1);
这相当于
item = (char*)heap + offset;
参考:优先级表在添加常量值之前,应该将var强制转换为正确的指针。此外,我建议将类型转换为非单选长,以确定64位宽度:
item = ((char *)heap) + offset
结果是:
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 long*)c);
printf("PTR (c+1) %p \n ",((unsigned long long*)c+1));
在添加常量值之前,应该将var强制转换为正确的指针。此外,我建议将类型转换为非单选长,以确定64位宽度:
item = ((char *)heap) + offset
结果是:
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 long*)c);
printf("PTR (c+1) %p \n ",((unsigned long long*)c+1));
当你做
&c
时,你会得到一个指向c
的指针,所以&c
是指向常量字符的指针。我认为你在施放之前是在递增的。这段代码绝对疯狂<代码>常量字符*cpp=(无符号字符*)&cp代码>毫无意义。@Mooing Duck-为什么不呢?取一个常量字符*
,取它的地址(一个常量字符**
),显式地将它转换成一个无符号字符*
(这是危险和无意义的),然后隐式地将它转换成常量字符*
(同样危险和无意义的)。看起来您想要的是const char**cpp=&cp代码>提示:如果C++中有类型转换,则代码可能是错误的。当你执行“代码>和代码<代码>时,你得到一个指针,指向<代码> c>代码>,所以<代码>和c>代码>是指向指针“指针>代码const char < /C>”的指针。代码>常量字符*cpp=(无符号字符*)&cp代码>毫无意义。@Mooing Duck-为什么不呢?取一个常量字符*
,取它的地址(一个常量字符**
),显式地将它转换成一个无符号字符*
(这是危险和无意义的),然后隐式地将它转换成常量字符*
(同样危险和无意义的)。看起来您想要的是const char**cpp=&cp代码>提示:如果C++中有类型转换,那么代码可能是错误的。哪一个是问题2?通过修复强制类型转换,代码应该可以工作(我想用户需要什么),如果你愿意,你可以编辑我的帖子,但我想通过修复强制类型转换指针,程序对于#2和#3是一样的。哦,天哪,我100%误解了他说的话。我的任命,删除我的评论。没问题,很高兴我们澄清了问题2?通过修复强制类型转换,代码应该可以工作(我想用户需要什么),如果你愿意,你可以编辑我的帖子,但我想通过修复强制类型转换指针,程序对于#2和#3是一样的。哦,天哪,我100%误解了他说的话。我的道歉,删除我的评论。没问题,很高兴我们解决了这个问题