c - printf 以不同的方式表现...并获取地址和值....字符串的地址和指针仅在取消引用后
问题描述
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
使用它就可以正常工作...
解决方案
%s
格式说明符 to用于printf
打印字符串,并需要一个char *
指向以空字符结尾的字符数组的第一个元素的参数。格式说明%d
符用于以十进制格式打印整数,并且需要int
.
由于str
是一个数组,当在表达式中使用时,它会衰减为指向其第一个元素的指针。所以str
在一个表达式中有 type char *
,它符合%s
预期。
*str
无效,%s
因为它具有类型char
并且具有数组中第一个字符的值。对给定参数使用错误的格式说明符会printf
调用未定义的行为。
*p
是有效的,%d
因为p
has type int *
,意思是*p
有 type int
,它符合%d
预期。
推荐阅读
- anaconda - Anaconda Env 未启动关联的 VSC 工作区
- bash - 复杂的 bash 函数返回布尔值
- performance - 性能测试/混沌测试气流的最佳方法是什么?
- javascript - 无法从对象获取结果 - 错误提示不存在
- javascript - android中的navigator.share api更改用户共享文件的名称
- java - 暂停的@transactional 方法是否会阻塞资源?
- python - 每次触发 KeyboardInterrupt 或其他错误后,Selenium 驱动程序都会因 MaxRetryError 而崩溃
- react-bootstrap - 另一个选项卡中的选项卡在 React Boostrap 5 中不起作用
- bash - 如何在 Emacs 中从另一个 Git 分支打开文件?
- javascript - 我想多拍