2013-10-30 39 views
1

这里是一个程序,我写它来逐个输出一个字符串的所有字符。但我也打印阵列的各个块的地址。问题是所有块的地址是相同的。为什么? 有人知道吗?为什么指针给所有数组块的地址相同?

#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; 
} 
+5

'for(i = 0; i <= 100000000; i ++);'??为什么这个 –

+1

@GrijeshChauhan回到我的老ATARI 800XL上,等待一秒钟就可以很容易地用'FOR I = 1到500:NEXT I'完成。但这种方法 - 等待循环 - 已经过时了大约20年。 – glglgl

+0

@glglgl是的,我在过去的某个地方读过它,它会消耗CPU周期。 ~~但是C编译器可以通过替换'i = 100000000;'来优化它,这是不可靠的。正确? –

回答

3

要打印的指针的地址,指针

的不是值尝试

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

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

+0

我使用%c和%p打印了值和地址 –

+0

@AshishTomer是的,但您也添加了'&',再次阅读答案。 '&ptr'应该只是'ptr' printf –

+0

哦是的:P
谢谢。 :) –

3

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

当您使用&ptr时,您将获得实际指针的地址,而不是指向的地址。删除&符号(地址 - 运营商&),因此您只有ptr

+0

是的你是对的。谢谢! :) 你能告诉我如何在启动时使用clrscr()清除屏幕? –

+0

@AshishTomer通过调用函数? –

+0

不,我知道,其实我加入CONIO.H但GCC给出了错误: “reverse.c:2:18:致命错误:CONIO.H:没有这样的文件或目录 的#include ^ 汇编终止” –

1

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

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

@Grijesh Chauhan:感谢格式化! – legends2k

+0

谢谢你们两位:) :) –

+0

你能告诉我如何清除屏幕?
我加了conio.h,但GCC给出错误:“reverse.c:2:18:致命错误:conio.h:**没有这样的文件或目录** #include ^编译终止。 –

相关问题