[英]printf is behaving in different ways…and taking address as well as value…address of string and for a pointer only after dereferencing
printf
接受字符串的地址,而在取消引用后不接受,而在使用指针的情况下则需要取消引用。
#include <stdio.h>
#include<stdio.h>
int main()
{
char str[100];
int i;
int j=0;
int *p;
p=&j;
scanf("%s",str);
for(i=0;str[i];i++)
{
if((str[i]>='A') && (str[i]<='Z'))
{
str[i]=str[i]+('a'-'A');
}
else
{
str[i]=str[i]-('a'-'A');
}
}
printf("%s",str); //it should have been printf("%s",*str); here we are passing address
printf("%d\n",j);
printf("%d",*p); //here we are passing evact value;
return 0;
}
与*
使用时会崩溃,并且如果仅使用str
则可以正常工作...
用于printf
的%s
格式说明符用于打印字符串,并且需要一个char *
参数,该参数指向以空字符结尾的字符数组的第一个元素。 %d
格式说明符用于以十进制格式显示整数,并且期望为int
。
由于str
是一个数组,因此在表达式中使用时,它将衰减为指向其第一个元素的指针。 因此,表达式中的str
类型为char *
,与%s
期望的类型匹配。
*str
对于%s
无效,因为它的类型为char
并且具有数组中第一个字符的值。 对printf
的给定参数使用错误的格式说明符会调用未定义的行为 。
*p
对%d
有效,因为p
类型为int *
,这意味着*p
类型为int
,与%d
期望的匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.