C printf以不同的方式运行…并且只在取消引用后才获取字符串和指针的地址以及值…地址

C printf以不同的方式运行…并且只在取消引用后才获取字符串和指针的地址以及值…地址,c,C,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')

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;
}
#包括
#包括
int main()
{
char-str[100];
int i;
int j=0;
int*p;
p=&j;
scanf(“%s”,str);
对于(i=0;str[i];i++)
{

如果((str[i]>='A')&&(str[i]
%s
格式说明符to
printf
用于打印字符串,需要一个
char*
参数,该参数指向以null结尾的字符数组的第一个元素。
%d
格式说明符用于以十进制格式打印整数,并需要一个
int

由于
str
是一个数组,当在表达式中使用时,它会衰减为指向其第一个元素的指针。因此表达式中的
str
具有类型
char*
,这与
%s
所期望的匹配

*str
%s
无效,因为它的类型为
char
,值为数组中的第一个字符。对
printf
的给定参数使用错误的格式说明符将调用


*p
%d
有效,因为
p
具有类型
int*
,这意味着
*p
具有类型
int
,与
%d
期望的类型相匹配。

char str[100]是一个指针。您不想取消引用它。您可以(我不是说您应该这样做)在同一变量上的数组/指针语法之间切换。@petrch数组和指针不一样。一个可以衰减到另一个,但它们是不同的。如果是“*p”,则取值..!!如果是字符串,则应为char*,如果是“p”,则应为“int”,为什么不取地址..基本上是在“scanf”中我们总是将输入作为“addressof”,如果是“printf”,它将取决于“说明符类型”(%d或%s等等)@dbush您在评论中写道char str[100]不是指针,但它“衰减”到它。我猜您可能指的是一些抽象定义,但从实际角度来看,如果您使用printf(%c:%c),str[0]*(str+0))您将得到完全相同的结果,包括汇编程序中的解释。此外,char*可以指向任何地方,您可以指向整数数组或内存中的任何位置,如果您愿意,可以将该位置解释为字符串。@petrch第6.3.2.1节:"除非是sizeof运算符的操作数、_Alignof运算符或一元&运算符,或者是用于初始化数组的字符串文字,否则类型为“array of type”的表达式将转换为类型为“pointer to type”的表达式,该表达式指向数组的初始元素“@petrch您可以将
char*
指向其他对象并将其视为字符串,但不能期望结果一致。