【问题标题】:Why pointer is giving the same address for all array blocks?为什么指针为所有数组块提供相同的地址?
【发布时间】:2013-10-30 10:49:40
【问题描述】:

这里有一个程序,我写的就是一个字符串的所有字符一个一个的输出。但我也打印了数组中各个块的地址。问题是所有块的地址都相同。为什么? 有人知道吗?

#include<stdio.h>
int main()
{
    char enter[]="Kinsman";
    char *ptr;  
    ptr=enter;
    int i=0;
    while(*ptr!='\0')
    {
        printf("%c%p\n",*ptr,&ptr);
        ptr++;
        for(i=0;i<=100000000;i++);
    }
return 0;
}

【问题讨论】:

  • for(i=0;i&lt;=100000000;i++); ??为什么会这样
  • @GrijeshChauhan 回到我的旧 ATARI 800XL,用FOR I=1 TO 500: NEXT I 轻松完成等待一秒钟。但是这种方法——按周期等待——已经过时了大约 20 年。
  • @glglgl 是的,我在过去某处读过它,它会消耗 CPU 周期。 ~~ 但是 C 编译器可以通过替换 i = 100000000;.. 来优化它。它不可靠。对吗?
  • @GrijeshChauhan 我用它只是为了让每个输出通过循环暂停。
  • @AshishTomer 最好使用适当的函数——Unix 上的sleep()usleep(),Windows 上的Sleep()

标签: c arrays string pointers


【解决方案1】:

因为你打印的是实际指针的地址。

当您使用&amp;ptr 时,您会得到实际指针的地址,而不是指向的地址。删除与号(地址运算符&amp;),这样你就只有ptr

【讨论】:

  • 是的,你是对的。谢谢! :) 你能告诉我如何在启动时使用 clrscr() 清除屏幕吗?
  • @AshishTomer 通过调用函数?
  • 不,我知道实际上我添加了 conio.h 但 GCC 给出错误:“reverse.c:2:18: fatal error: conio.h: No such file or directory #include ^ 编译终止。”
  • @AshishTomer 清除“屏幕”有什么意义?作为用户,这会让我很恼火,因为我忘记了之前发生的事情。这真的是绝对必要的吗?
  • @glglgl 不!这不是必需的。我只是想 :P :D
【解决方案2】:

你打印的是指针的地址,而不是指针的值

试试

printf("%c%p\n",*ptr, static_cast<void*>(ptr));

(https://stackoverflow.com/a/18929285/259)

【讨论】:

  • 我使用 %c 和 %p 打印了值和地址
  • @AshishTomer 是的,但您还添加了&amp;,请再次阅读答案。 &amp;ptr 在 printf 中应该只是 ptr
  • @AshishTomer:您可能希望看到this postclrscr
  • 在没有void * 的情况下使用%p未定义的行为。除非参数是 ptr-to-void,否则需要强制转换。
  • @legends2k 谢谢。我得到它。 :)
【解决方案3】:

ptr 是一个指针,它也是堆栈中具有地址的变量。这是固定的,而它所指向的内容因ptr++ 而不同,因此您必须打印指向的值而不是指针本身的地址。

 printf("%c%p\n",*ptr, (void*)ptr);
 //                   ^  remove & , and add void*

【讨论】:

  • 谢谢你们两个:) :)
  • 你能告诉我如何清除屏幕吗?
    我添加了 conio.h 但 GCC 给出错误:“reverse.c:2:18: fatal error: conio.h: No such file or directory #include ^编译终止。”
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多