<Preguntas del examen escrito> Puntero

contenido

1. Pregunta 1 de la prueba escrita:

2. Pregunta 2 de la prueba escrita:

3. Pregunta 3 de la prueba escrita:

4. Pregunta 4 de la prueba escrita:

5. Pregunta 5 de la prueba escrita:

6. Pregunta 6 de la prueba escrita:

7. Pregunta 7 de la prueba escrita:

8. Pregunta 8 de la prueba escrita:


1. Pregunta 1 de la prueba escrita:

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

  •  Analizar gramaticalmente:

  • * (punto - 1)

&a significa eliminar la dirección de toda la matriz, &a+1 salta toda la matriz, el tipo de &a: int(*)[5], el tipo de &a+1 sigue siendo int(*)[5], cast &a+1 Para int*, asígnelo a ptr, luego ptr apunta a la dirección de &a+1, ptr-1 es la dirección del elemento anterior, y luego elimine la referencia a *(ptr-1) para obtener 5.

  • *(a + 1):

a representa la dirección del primer elemento 1 del nombre de la matriz, +1 representa la dirección del elemento 2 y la desreferencia *(a+1) es 2.

2. Pregunta 2 de la prueba escrita:

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

	printf("%x\n", p + 0x1);
	printf("%x\n", (unsigned long)p + 0x1);
	printf("%x\n", (unsigned int*)p + 0x1);

    //%p以地址的形式打印,不省略0
    //%x就是打印16进制,省略0
	return 0;
}

  • Analizar gramaticalmente:
  • p+0x1:

El puntero de entero (int*)+1 omite 4 bytes, el puntero de carácter (char*)+1 omite 1 byte y el puntero de estructura p+1 debe omitir un tamaño de estructura, que es de 20 bytes. El hexadecimal de 20 es 0x000014 , y después de agregarlo es 0x100014.

  • (largo sin firmar) p + 0x1:

"p era originalmente un puntero a una estructura. Si se obliga a p a convertirse en un tipo largo sin signo, se convertirá en un tipo entero sin signo y dejará de ser un puntero. Dado que es un tipo entero sin signo, se trata como un número, y después de agregar 1, es directamente Solo agréguelo, es decir, 0x100001

  • (int sin signo*)p + 0x1:

p se convierte en un puntero entero, el puntero entero +1 salta 4 bytes y sumar 4 es 0x100004

3. Pregunta 3 de la prueba escrita:

#include<stdio.h>
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;
}

  • Analizar gramaticalmente:
  •  punto1[-1]:

&a extrae la dirección de la matriz, &a+1 omite toda la matriz, la convierte en int* y la asigna a ptr1. En este momento, la dirección de ptr1 es &a+1, y ptr[-1] es equivalente a *(ptr1- 1) , la dirección de ptr1-1 es como se muestra en la figura y el resultado sin referencia es 4.

  • *ptr2:

El nombre de matriz a representa la dirección del primer elemento, y el tipo forzado se convierte en un número entero, que es un valor. Agregar 1 significa agregar 1 byte. La memoria debe convertirse en datos en bytes, y el elemento 1 es 4 palabras Sección, si es little endian, suponiendo que la dirección de a es 0x10, convertida a decimal es 16, más 1 es 17, hexadecimal es 0x11, encuentre la dirección de ptr2, y luego la desreferencia solo necesita acceder a 4 bytes más se puede imprimir como 2000000. El proceso se muestra en la figura.

4. Pregunta 4 de la prueba escrita:

#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;
}

  •  Analizar gramaticalmente:

Hay un hoyo en esta pregunta, y se prueba la expresión de coma, int a[3][2] = { (0, 1), (2, 3), (4, 5) }; este código se puede convertir en int a[3 ][2] = { 1, 2, 5 }; Esta matriz tiene 3 filas y 2 columnas, a[0] es el nombre de la matriz de la primera fila, el nombre de la matriz representa la dirección del primer elemento, y a[0] representa la primera fila de la primera fila La dirección de un elemento, es decir, la posición a la que apunta p, p[0] = *(p+0) = *p , y p desreferencias para obtener 1 .

5. Pregunta 5 de la prueba escrita:

#include<stdio.h>
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;
}

  • Analizar gramaticalmente:

  •  &a[4][2]:

&a[4][2] representa la dirección de la fila 5 y la columna 3, como se muestra en la figura.

  • &p[4][2]:

 p es un puntero de matriz, la matriz a la que puede apuntar p es de 4 elementos, p+1 omite 4 enteros, que son 16 bytes, p[4][2] --->*(*(p+4 )+2 ), a es el nombre de matriz de la matriz, es decir, la dirección del primer elemento, asigne a a p, y p también apunta a la dirección, como se muestra en la figura. p+1 salta una matriz de 4 elementos, la posición de +4 es como se muestra en la figura, *(p+4) busca 4 elementos hacia atrás, como se muestra en el cuadro amarillo *(p+4), *(p+ 4 )+2 salta la posición a la que apuntan 2 elementos como se muestra en la figura, y luego la desreferencia, y se obtiene el elemento.

  • &p[4][2] - &a[4][2] El número de elementos en el medio es 4 restando las direcciones de los dos tipos enteros, porque la dirección pequeña reduce la dirección grande, por lo que la impresión en forma de %d es - 4
  • E imprimir en forma de %p es imprimir la dirección, solo imprimir el complemento.

Complemento de -4: 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1100

Convertido a la impresión hexadecimal es FFFF FFFF FFFF FFFC

6. Pregunta 6 de la prueba escrita:

#include<stdio.h>
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;
}

  • Analizar gramaticalmente:
  • *(ptr1 - 1):

&aa significa la dirección de la matriz bidimensional, &aa+1 significa saltar toda la matriz bidimensional a la posición que se muestra en la figura, forzarla en un puntero entero y asignarlo a ptr1.La dirección de ptr1-1 es como se muestra en la figura, y luego desreferenciarlo es el número 10.

  • *(ptr2 - 1):

aa es el nombre de la matriz que indica la dirección de la primera línea del primer elemento de la matriz bidimensional, aa+1 salta la primera línea a la segunda línea como se muestra en la figura, y luego elimina las referencias *(aa+1) a obtener la segunda línea del nombre de la matriz La dirección del primer elemento, es decir, la dirección del elemento 6, se asigna a ptr2 a la fuerza, y ptr2-1 avanza y lo desreferencia para obtener 5.

7. Pregunta 7 de la prueba escrita:

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

  • Analizar gramaticalmente:

 El tipo de pa es char*, agregar 1 significa omitir un elemento de char*, apuntar a la posición como se muestra en la figura, luego desreferenciar *pa para obtener la dirección de a, y luego %s accede hacia atrás a \0 para detenerse. . Eso es en.

8. Pregunta 8 de la prueba escrita:

#include<stdio.h>
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;
}

  • Analizar gramaticalmente:
  • ** ++ cp:

 ++cpp salta la dirección de un elemento char** a la posición que se muestra en la figura, elimina la referencia a *++cpp para obtener el elemento c+2, c+2 es la dirección del tercer elemento en c, y luego resuelve The referencia obtiene la dirección de p y la imprime en forma de %s hasta \0, es decir, PUNTO.

  • * - * ++ cpp + 3 :

++cpp salta otro elemento char* a la posición del icono, y luego elimina la referencia * ++cpp para obtener c+1, -- * ++cpp hace c+1-1=c, en este momento c es la matriz c Nombre la dirección del primer elemento, luego elimine la referencia *-- * ++cpp para obtener la dirección de E, luego +3 para apuntar a la segunda E, y luego imprima ER en %s.

  •  * cpp [-2] + 3 :

  *cpp[-2] es **(cpp-2)+3. La ubicación a la que apunta cpp-2 se muestra en la figura, elimine la referencia *(cpp-2) para obtener c+3, luego elimine la referencia **(cpp-2) para obtener la dirección de F, luego +3 apunta a S, y luego %s Imprimir ST.

  • cpp [-1] [- 1] + 1 :

 cpp[-1][-1] + 1 es *(*(cpp-1)-1)+1, la posición de cpp-1 es como se muestra en la figura, la desreferenciación obtiene c+2, menos 1 es c+ 1, y luego Desreferenciar *(*(cpp-1)-1) para obtener la dirección de N, más 1 para apuntar a E, %s imprime EW.

Supongo que te gusta

Origin blog.csdn.net/bit_zyx/article/details/122590914
Recomendado
Clasificación