C中字符串文本的地址

C中字符串文本的地址,c,arrays,string,printf,C,Arrays,String,Printf,我已经读到字符串文本的类型是char[n+1],其中n是长度。字符串文本的存储是一个实现问题。但它在瞬间必须是唯一的 printf ("%u\t %s\t %d\t %c\t %f\t %e\t %x\t %p\t", &"XY",&"XY",&"XY",&"XY",&"XY",&"XY",&"XY",&"XY"); 这段代码的输出是 4206628 XY 4206628 $ 0.000000 1.800980e-30

我已经读到字符串文本的类型是char[n+1],其中n是长度。字符串文本的存储是一个实现问题。但它在瞬间必须是唯一的

printf
("%u\t %s\t  %d\t  %c\t  %f\t  %e\t  %x\t  %p\t",
&"XY",&"XY",&"XY",&"XY",&"XY",&"XY",&"XY",&"XY");
这段代码的输出是

4206628 XY 4206628 $ 0.000000 1.800980e-307 7ffde000 00000032

为什么
%f
给出零,
%s
给出XY(没有
&
?)的效果,
%p
给出了完全不同的值?

您不能传递错误类型的值(与格式说明符所期望的类型不匹配),也不能获得未定义的行为

例如,
double
(这是
%f
所期望的)很可能比指针(这是您实际正在传递的)大,从而导致传递的值与
printf()
所使用的值不匹配,从而或多或少造成混乱

为什么
%f
为零

因为
%f
需要一个
双倍的
,而不是,这会导致未定义的行为

%s
给出了
XY
(没有
的影响?)

可能是因为对于数组
arr
arr
&arr
具有相同的值。但是,类型是不同的,这意味着您正在将意外类型传递给
printf
,同样是未定义的行为

%p
给出了一个完全不同的值


这是您要查找的指针值。

C中字符串的类型是
char[N+1]
其中
N
是字符串的长度,而不是
const char[N+1]
。我在某个地方读到它是常量…这是C++中的情况,对于您的问题,所有转换都会调用未定义的行为,没有一个是正确的。%x要打印指针的地址,%p,至少这两个地址应该是一致的。我以前用过%u打印地址,都不正确吗?还有&“XY”,指针通过%s给出XY。为什么?至少应该打印一些数字,如十六进制?%f理解。与%c的原因类似,但%p和%u应该给出相同的结果,对吗?好的..谢谢。不使用%u%x是正确的选项。我想对于所有类型。@user2653718:否。指针和
无符号int
可能大小不同,并且可能不会以相同的方式传递给函数。%u还应该给出与%p给出的地址不同的地址。或者它们应该给出不同的结果吗?@user2653718,
%u
需要一个无符号整数,但事实并非如此,因此未定义的行为。地址也可以是-ve?但%x和%p仍应指向同一地址?此处十六进制的十进制等效值为2147344384,而%p给出了其他值。只有%p是打印地址的正确方式吗?@user2653718-每个代码都有一个特定大小的预期类型(以位为单位的宽度)…这意味着每段代码对您提供的值的解释都不同,可能包括检查比您提供的更少或更大的位。比提供的更少或更大的位,我理解为,即使类型的大小相同,位的数量也会有所不同。因此,无符号int和有符号int在这方面也会有所不同.好的,谢谢。