Quelques sujets sur les pointeurs en langage C (2)

Cet article continue le blog précédent

Quelques sujets du pointeur du langage C (1)_Blog de Naion - Blog CSDN https://blog.csdn.net/Naion/article/details/122548523 Continuons à faire quelques sujets.

 

Question 1 du test écrit :

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);
    printf( "%d,%d", *(a + 1), *(ptr - 1));
    return 0;
}
//程序的结果是什么?

Analyse :

2.a est l'adresse du premier élément du tableau, +1 obtiendra l'adresse du deuxième élément du tableau, en *, vous obtiendrez l'élément 2;

5.&a, obtenir l'adresse du tableau, puis +1, ignorer tout le tableau. Après la coercition, la position de ptr est derrière le tableau. -1, il pointe vers 5, c'est-à-dire qu'après -1 est l'adresse du 5, en *, vous obtiendrez 5 ;

Question 2 de l'examen écrit :

struct Test
{
     int Num;
     char *pcName;
     short sDate;
     char cha[2];
     short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
     p = (struct Test*)0x100000;
     printf("%p\n", p + 0x1);
     printf("%p\n", (unsigned long)p + 0x1);
     printf("%p\n", (unsigned int*)p + 0x1);
     return 0;
}

Analyse :

Ici, nous supposons que la taille de cette structure est de 20 octets et indiquons que la valeur p est 0 x 100 000. Puisqu'il est supposé, lors de l'exécution, les résultats peuvent être différents, mais leur différence est la même.

0x100014.p voici l'adresse de la structure, c'est +1, c'est-à-dire sauter la taille de toute la structure de 20 octets, puis convertir 20 en hexadécimal, soit 0x100014 ;

0x100001.p est forcé d'être converti en un entier long non signé, puis +1, qui est sa valeur +1, qui est 0x100000 ;

0x100004.p est converti en un pointeur int non signé, puis +1 ignorera la taille de ce pointeur int, qui est 0x100004 ;

Question 3 de l'examen écrit :

int main()
{
    int a[4] = { 1, 2, 3, 4 };
    int *ptr1 = (int *)(&a + 1);
    int *ptr2 = (int *)((int)a + 1);
    printf( "%x,%x", ptr1[-1], *ptr2);
    return 0;
}

Analyse :

4.&a, est l'adresse de ce tableau, puis +1, sautez ce tableau, où ptr1[-1], écrit sous la forme d'un pointeur est *(ptr1 - 1), qui vaut 4 ;

2000000 (mode petit endian) a, est l'adresse du premier élément du tableau, puis (int), force le type à être converti en décimal, +1, c'est-à-dire ajouter 1 à la décimale, puis convertir en hexadécimal. Notez que int est un saut de 4 octets.

Question écrite 4 :

int main()
{
    int a[5][5];
    int(*p)[4];
    p = a;
    printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    return 0;
}

 Analyse :

 ff ff ff fc Comme le montre la figure, vous pouvez convertir -4 en hexadécimal.

-4. Comme indiqué.

Question écrite 5 :

#include <stdio.h>
int main()
{
    int a[3][2] = { (0, 1), (2, 3), (4, 5) };
    int *p;
    p = a[0];
    printf( "%d", p[0]);
 return 0;
}

Analyse :

1. Faites attention aux parenthèses ici, pas {}, c'est une expression de virgule, donc les éléments de l'ensemble du tableau à deux dimensions sont 1, 3, 5. p=a[0], obtenez la première ligne, puis p[0 ], qui est le premier élément de la première ligne ;

Question 6 de l'examen écrit :

int main()
{
    int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int *ptr1 = (int *)(&aa + 1);
    int *ptr2 = (int *)(*(aa + 1));
    printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
    return 0;
}

Analyse :

10.&aa obtenir l'adresse du tableau à deux dimensions, puis +1, ignorer le tableau à deux dimensions, le convertir en type int* et utiliser le pointeur ptr1 pour recevoir.ptr1-1 est l'adresse de l'élément 10, et alors * est l'élément 10 ;

5.aa est l'adresse du premier élément du tableau. Pour un tableau à deux dimensions, c'est sa première ligne. Ensuite +1, sautez la première ligne, et venez à la deuxième ligne. Cette adresse est reçue par le ptr2 pointeur -1, c'est l'adresse de 5, puis *, l'élément 5 est retiré ;

Question 7 de l'examen écrit :

#include <stdio.h>
int main()
{
 char *a[] = {"work","at","alibaba"};
 char**pa = a;
 pa++;
 printf("%s\n", *pa);
 return 0;
}

Analyse :

à Comme le montre la figure:

 Question 8 de l'examen écrit :

int main()
{
 char *c[] = {"ENTER","NEW","POINT","FIRST"};
 char**cp[] = {c+3,c+2,c+1,c};
 char***cpp = cp;
 printf("%s\n", **++cpp);
 printf("%s\n", *--*++cpp+3);
 printf("%s\n", *cpp[-2]+3);
 printf("%s\n", cpp[-1][-1]+1);
 return 0;
}

Analyse :

 

 Le pointeur pointe vers l'image : (faites attention à la priorité !)

POINT.cpp++, en c+2, puis *, pour obtenir la valeur POINT à l'intérieur ;

ER.cpp hérite de l'adresse de l'impression précédente, puis ++, à l'adresse de c+1, puis *, pour obtenir l'adresse de c+1, puis --, indiquant que c+1 est changé en c, c'est-à-dire , son point n'est pas NEW, mais ENTER, +3, il atteint l'adresse de E, puis *, c'est ER ;

ST.*cpp[-2]+3, ça équivaut à * *(cpp-2)+3.cpp-2, ça va en c+3, puis *, ça prend l'adresse de c+3, puis * , puis obtenez PREMIER, puis +3, lorsque vous arrivez à S, sortez ST ;

EW. Équivalent à *(*(cpp-1)-1)+1, -1, puis vous obtenez c+2, puis *, vous obtenez c+2, puis -1, puis c+2 devient c + 1, puis *, vous obtiendrez NEW, puis +1, vous obtiendrez EW ;

Je suppose que tu aimes

Origine blog.csdn.net/Naion/article/details/122590308
conseillé
Classement