C 试图理解指针算法

C 试图理解指针算法,c,pointers,C,Pointers,如果你看一下演示指针算法的部分,我希望得到以下结果 1) 前两行分别打印一个地址的“char pointers”,因此差异应该是“1”-这就是我们得到的结果 2) 接下来的两行分别打印一个地址的“int pointers”,因此差异应该是“4”-出了什么问题 3) 接下来的两行分别打印一个地址的“长指针”,因此差异应该是“4/8”-出了什么问题???在将值转换为所需指针之前,您正在增加值 要将“c”解释为另一个指针,您应该 PTR c 0x4007a0 PTR cp

如果你看一下演示指针算法的部分,我希望得到以下结果

1) 前两行分别打印一个地址的“char pointers”,因此差异应该是“1”-这就是我们得到的结果

2) 接下来的两行分别打印一个地址的“int pointers”,因此差异应该是“4”-出了什么问题


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%误解了他说的话。我的道歉,删除我的评论。没问题,很高兴我们解决了这个问题