C-Sprache – schriftliche Testfragen für Pointer-Interviews

Inhaltsverzeichnis

Vorwort

Schriftliche Testfrage 1:

Themenanalyse: 

Schriftliche Testfrage 2:

Fragenanalyse:

Schriftliche Testfrage 3:

Fragenanalyse:

Ali hat Testfragen geschrieben:

 Fragenanalyse:


Vorwort

        In den vorherigen Kapiteln haben wir etwas über Zeiger gelernt. Heute stellen wir eine Reihe schriftlicher Interviewfragen zu Zeigern.

Schriftliche Testfrage 1:

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

Themenanalyse: 

*(a + 1) ist a[1], also ist das Ergebnis 2.

int *ptr = (int *)(&a + 1);&a bedeutet, die Adresse des gesamten Arrays herauszunehmen, +1 bedeutet, das gesamte Array zu überspringen. Zu diesem Zeitpunkt war ptr bereits außerhalb des Arrays array, *(ptr - 1) und lassen Sie ptr auf das letzte Element des Arrays zeigen.

Schriftliche Testfrage 2:

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);
	return 0;
}

Fragenanalyse:

 p + 0x1, p ist der Strukturzeiger, +1 überspringt die Größe einer Struktur und das Ergebnis ist ox100020.

(unsigned long)p + 0x1), zu diesem Zeitpunkt ist p ein Zeiger vom Typ long, sodass nur ein Byte übersprungen wird und das Ergebnis 0x100001 ist.

(unsigned int*)p + 0x1), zu diesem Zeitpunkt ist p ein Zeiger vom langen Typ, sodass nur vier Bytes übersprungen werden und das Ergebnis 0x100004 ist.

Schriftliche Testfrage 3:

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

Fragenanalyse:

 char**pa zeigt auf a. Zu diesem Zeitpunkt zeigt pa auf das erste Element von a. Für pa++ zeigt pa auf das nächste Element von a.

 

Ali hat Testfragen geschrieben:

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

 Fragenanalyse:

Entsprechend den Anforderungen der Frage ergibt sich folgende Zahl:

1.++cpp, das heißt, cpp zeigt auf die Position von c+2, und das Ergebnis ist POINT.

2. *-- * ++cpp + 3, wir berechnen zuerst die Priorität *++cpp, das heißt, cpp zeigt auf die Position von c+1, also char**cp[c+1], also char* c[1] zeigt beim Ausführen der --Operation auf die Position von char*c[0] und führt dann die +3-Operation aus, was bedeutet, dass *c[0]+3 erstellt wird und dann darauf gezeigt wird 'E& #39;, sodass Sie das Ergebnis ER erhalten.

3.*cpp[-2]+3 = **(cpp-2)+3,cpp-2 gibt cpp an die Position von c+3 zurück, dh die Adresse von char*c[3] wird erhalten ist F Die Adresse von S wird durch Ausführen der +3-Operation erhalten, das Ergebnis ist also ST.

4.cpp[-1][-1] + 1=*(*(cpp-1)-1)+1,*(cpp-1) erhält c+2, und dann -1 erhalten Sie c+ 1 Die Adresse ist die Adresse von char*c[1], also die Adresse von „N“. Addiere eins, um die Adresse von „E“ zu erhalten, das Ergebnis ist also EW.

Supongo que te gusta

Origin blog.csdn.net/2301_76618602/article/details/133019432
Recomendado
Clasificación