【问题标题】:Attempting to understand pointer arithmetic试图理解指针算法
【发布时间】: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' - 出了什么问题??

【问题讨论】:

  • 当你执行&amp;c 时,你会得到一个指向c 的指针,所以&amp;c 是一个指向const char 的指针。
  • 我认为你在施法之前会增加
  • 这段代码绝对是疯了。 const char *cpp = (unsigned char*)&amp;cp;毫无意义。
  • @Mooing Duck - 为什么不呢?
  • 获取const char*,获取该地址(const char**),将其显式转换为unsigned char*(这是危险且毫无意义的),然后隐式将其转换为@ 987654331@(同样危险且毫无意义)。看起来您想要的是 const char** cpp = &amp;cp; 提示:如果您在 C++ 中有类型转换,那么您的代码可能是错误的。

标签: c pointers


【解决方案1】:

在将它们转换为所需指针之前,您正在递增值

要将“c”解释为另一个指针,您应该这样做

printf("PTR    (c+1)  %p \n ",(unsigned int*)c+1);

否则括号将优先于在强制转换之前的增量。

没有这些括号,强制转换的优先级高于加法,如下所示

item = (char*)heap + offset;

相当于

item = ((char *)heap) + offset

参考:优先表C type casts and addition precedence

【讨论】:

  • 第二个问题是哪一个?通过修复演员表,代码应该可以工作(我想用户想要的)
  • 您可以根据需要编辑我的帖子,但我想通过修复演员表指针,#2 和 #3 的过程是相同的
  • 天哪,我 100% 误解了他的意思。抱歉,删除我的 cmets。
  • 没问题,很高兴我们解决了这个问题
【解决方案2】:

在添加 const 值之前,您应该将 var 转换为正确的指针。我还建议将类型转换为 unsingned long long 以确定 64 位宽度:

    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));

结果是:

PTR     c     0x80485f0
 PTR    (c+1)  0x80485f1
 PTR     c     0x80485f0
 PTR    (c+1)  0x80485f4
 PTR     c     0x80485f0
 PTR    (c+1)  0x80485f8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多