C指针中的查询

C指针中的查询,c,C,我试图在c中打印一个char类型的指针,我可以看到下面的值和它的内存地址 char *ptr = "I am a string"; printf("\n value [%s]\n",ptr); printf("\n address [%d]\n",&ptr); 但是,当我直接按如下方式打印指针时,它将错误显示为分段错误 char *ptr = "I am a string"; printf("\n value [%s]\n

我试图在c中打印一个char类型的指针,我可以看到下面的值和它的内存地址

     char *ptr = "I am a string"; 

     printf("\n  value [%s]\n",ptr);
     printf("\n  address [%d]\n",&ptr);
但是,当我直接按如下方式打印指针时,它将错误显示为
分段错误

     char *ptr = "I am a string"; 

     printf("\n  value [%s]\n",*ptr);
请告诉我这里出了什么问题


注意:如果我将printf中的格式更改为[%d]或[%i],则它正在打印

*ptr
是字符,而不是字符指针,
%s
需要字符指针(指向C字符串)。将字符视为指针时,
printf
尝试访问无效的内存地址,您会遇到分段错误。

当您将格式
“%s”
传递到
printf
中时,函数需要指向字符数组的指针。

格式说明符需要指向以0结尾的字符数组的指针。如果
printf
的相应参数是
*ptr
,则a
char
,即a)未定义的行为,b)可能导致字符的值(提升为
int
)和可能的一些任意相邻字节,被解释为指针。在该假定指针之后,可能会访问未分配给程序的内存。

printf(“\n值[%s]\n”,ptr)
@Sukumar你知道什么是
*ptr
*ptr
的值和类型是什么?@Als我不认为引用Sukumar的第二行代码有助于理解问题所在。@MrLister:我建议在评论之前仔细阅读。我将其作为评论发布,因为我没有足够的时间或动机详细解释答案。请随意添加您自己的答案,而不是批评他人。指针的正确格式说明符是%p,而不是%d,因此最好是
printf(“\n地址[%p]\n”,ptr)是的。。。正在尝试访问0x00上的内存-0xff:)@MrJames地址0x0049。