printf ведет себя по-разному ... и принимает адрес и значение .... адрес строки и для указателя только после разыменования - PullRequest
0 голосов
/ 24 апреля 2019

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 Используется, работает нормально ...

1 Ответ

8 голосов
/ 24 апреля 2019

Спецификатор формата %s для printf используется для печати строки и ожидает аргумент char *, который указывает на первый элемент массива символов с нулевым символом в конце. Спецификатор формата %d используется для печати целого числа в десятичном формате и предполагает int.

Поскольку str является массивом, при использовании в выражении он распадается в указатель на свой первый элемент. Таким образом, str в выражении имеет тип char *, который соответствует ожидаемому %s.

*str недопустимо для %s, поскольку оно имеет тип char и имеет значение первого символа в массиве. Использование неправильного спецификатора формата для данного аргумента для printf вызывает неопределенное поведение .

*p действителен для %d, поскольку p имеет тип int *, что означает, что *p имеет тип int, что соответствует ожидаемому %d.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...