从C开始工作已经很长时间了,所以现在重新访问它。C - 基本指针问题
你能帮我解释'ptr'在下面的代码中有什么值吗?
char str[] = "100";
char *ptr;
ptr = *str;
printf("\n %p \t %d \n", ptr, ptr);
输出显示:
0X31 49
我知道,指定*海峡到PTR是不正确的,我不过想明白是什么会实际上意味着。那么49站在这里呢?
从C开始工作已经很长时间了,所以现在重新访问它。C - 基本指针问题
你能帮我解释'ptr'在下面的代码中有什么值吗?
char str[] = "100";
char *ptr;
ptr = *str;
printf("\n %p \t %d \n", ptr, ptr);
输出显示:
0X31 49
我知道,指定*海峡到PTR是不正确的,我不过想明白是什么会实际上意味着。那么49站在这里呢?
C非常容易为不同种类的变量赋值。这就是为什么你没有得到一个错误,即使你应该!
因此,您正在将*str
或str
指定为ptr
。 str
是一个字符指针,所以它指向一个字符,在这种情况下,'1'
在"100"
。
这一点,那么,是分配给ptr
值,该值'1'
或49(至少在一个基于ASCII的系统。在其他系统上,你会得到一个不同的值'1'
。比如一个EBCDIC机, '1'
应该是241而不是49.)
然后您试图打印ptr
的值,首先作为指针显示十六进制指针的数值,然后显示为十进制数值。
现在这是一件好事,你不打印*ptr
,因为那样会出错!
我确实尝试了打印* ptr并得到了分段错误:)你能解释一下上面代码中实际引用的* ptr吗? – user691197
'* ptr'是ptr指向的内容。但由于它没有有效的价值,它并没有指向任何有用的东西。大多数内存管理系统可以识别你的进程是否取消了你不拥有的内存位置,并给你一个分段错误(作为一个故障保护设备,真的,不惩罚你!),但你不应该指望这一点。 –
49是您在此处使用%d打印的1的ASCII码值。由于您正在打印存在于数组的第一个存储单元中的元素值(ptr = * str = * str [0]),在此处为1,因此您得到ASCII值为1,因为%d。
str
不是一个char数组,它只是一个指针,它指向应该数组的第一个内存位置,就像@Am_I_Helpful所说的那样。通过编写*str
,您可以获得位于str
分的位置的值 - 这意味着您获取阵列中的第一个值。
您的编译器有义务针对此代码发布诊断。如果没有,请获得一个新的编译器。 – EOF