структура в C с помощью указателей - PullRequest
0 голосов
/ 03 декабря 2018

Я не могу понять вывод, который дает мой код, который используется с указателями.Может ли кто-нибудь помочь мне с этим

вот мой код,

#include <stdio.h>

void main(){

    struct stype {
        int x;
        char *p;
    };

    struct stype s[ ] = {
                        { 1 , "Colombo" },
                        { 2 , "Gampaha" },
                        { 3 , "Kalutara" },
                        { 4 , "Matara" },
                        { 5 , "Galle" },
                        };
    struct stype *t;

    t = s;
    t++;

    printf( "%d\n" , t->x );
    printf( "%c\n", *( ++t->p ) );
    printf( "%s\n" , t->p );
    printf( "%d\n" , ( ++t )->x );
    printf( "%s\n", ++t->p );
    printf( "%s\n" , ++t->p );
    printf( "%c\n" , *( ++t->p ) + 5 );

}

Вот вывод, который я получаю

2
a
ampaha
3
alutara
lutara
z

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Я думаю, у вас были проблемы с пониманием printf( "%c\n" , *( ++t->p ) + 5 );, верно?

*( ++t->p ) = u

ascii для вас равно 117.

117 + 5 = 122

ascii значение z равно 122.

так, вывод равен z.

0 голосов
/ 03 декабря 2018

Объяснение дано построчно

struct stype *t ;                  // t is a pointer to struct
t = s ;                            // t will point to the array
t++;                               // increment t, so it will point to the 
                                   //  first element i.e. s[1] 
printf( "%d\n" , t->x ) ;          // print s[1].x i.e 2
printf( "%c\n", *( ++t->p ) ) ;    // Here the precedence rules come into play. 
                                   // The Prefix increment is in level 2 and -> operator 
                                   // is in level 1, so -> operator will be carried out first   
                                   // and then ++, t-> p will point to  "Gampaha"   
                                   // and incrementing that will point 
                                   // to the next character "ampaha" 
                                   // so *(++t->p) will give 'a'
printf( "%s\n" , t->p ) ;          // t->p is already incremented, 
                                   // so it will point to "ampaha". 
printf( "%d\n" , ( ++t )->x ) ;    // t is incremented to point to s[2] 
                                   // and x, of that is taken, so will print 3
printf( "%s\n", ++t->p ) ;         // t-> p is first executed, "Kalutara",  
                                   // t->p is incremented so, "alurata" is printed.
printf( "%s\n" , ++t->p ) ;        // again t-> p is first executed, "alutara",  
                                   // t->p is incremented so, "lurata" is printed.
printf( "%c\n" , *( ++t->p ) + 5 ) ;   // t-> p is first executed "lutara", 
                                       // t-> p is incremented "utra" *( ++t->p ) is 'u' 
                                       // and 5 is added to that to get 'z'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...