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 ;