-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathseries-c-23.tex
102 lines (83 loc) · 3.83 KB
/
series-c-23.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
\documentclass[french,a4paper,addpoints,11pt]{exam}
\usepackage{hexercises}
\usepackage{mathtools, nccmath}
\usepackage{tabularx}
\title{Les pointeurs}
\seriesno{\texttt{0x23}}
\department{TIN}
\classroom{INFO2-TIN}
\setlength\answerlinelength{10 cm}
\setlength\answerskip{3ex}
\setlength\answerclearance{1.1ex}
\CorrectChoiceEmphasis{}
\renewcommand{\thepartno}{\alph{partno}}
\renewcommand{\partlabel}{\thepartno.}
\renewcommand{\arraystretch}{1.75} % expand the cells vertically
\begin{document}
\maketitle
\thispagestyle{headandfoot}
\begin{questions}
\question Complétez le tableau suivant en indiquant la valeur des variables après chaque instruction.
Pour indiquer que la variable \CD{p} contient l'adresse \CD{k}, on notera \CD{&a} dans la colonne \CD{p}.
Pour indiquer qu'une variable est non initialisée ou que son contenu n'est pas connu, la case sera laissée vide.
\setlength\fillinlinelength{1.5cm}
\medskip
\begin{center}
\begin{tabularx}{\textwidth}{Xccccc}
Instruction & \CD{a} & \CD{b} & \CD{c} & \CD{p} & \CD{q} \\ \hline
\CD{int a = 1;} & \fillin[1] & \fillin[ ] & \fillin[ ] & \fillin[ ] & \fillin[ ] \\
\CD{int b = 2;} & \fillin[1] & \fillin[2] & \fillin[ ] & \fillin[ ] & \fillin[ ] \\
\CD{int c = 3;} & \fillin[1] & \fillin[2] & \fillin[3] & \fillin[ ] & \fillin[ ] \\
\CD{int *p = &a;} & \fillin[1] & \fillin[2] & \fillin[3] & \fillin[\&a] & \fillin[ ] \\
\CD{int *q = &c;} & \fillin[1] & \fillin[2] & \fillin[3] & \fillin[\&a] & \fillin[\&c] \\
\CD{*p=(*q)++;} & \fillin[3] & \fillin[2] & \fillin[4] & \fillin[\&a] & \fillin[\&c] \\
\CD{p = q;} & \fillin[3] & \fillin[2] & \fillin[4] & \fillin[\&c] & \fillin[\&c] \\
\CD{q=&b;} & \fillin[3] & \fillin[2] & \fillin[4] & \fillin[\&c] & \fillin[\&b] \\
\CD{*p-=*q;} & \fillin[3] & \fillin[2] & \fillin[2] & \fillin[\&c] & \fillin[\&b] \\
\CD{++*q;} & \fillin[3] & \fillin[3] & \fillin[2] & \fillin[\&c] & \fillin[\&b] \\
\CD{*p*=*q;} & \fillin[3] & \fillin[3] & \fillin[6] & \fillin[\&c] & \fillin[\&b] \\
\CD{a=++*q**p;} & \fillin[24] & \fillin[4] & \fillin[6] & \fillin[\&c] & \fillin[\&b] \\
\CD{p=&a;} & \fillin[24] & \fillin[4] & \fillin[6] & \fillin[\&a] & \fillin[\&b] \\
\CD{*q=*p/=*q;} & \fillin[6] & \fillin[6] & \fillin[6] & \fillin[\&a] & \fillin[\&b] \\
\CD{int *r[3] = {&a, &b, &c};} & \fillin[6] & \fillin[6] & \fillin[6] & \fillin[\&a] & \fillin[\&b] \\
\end{tabularx}
\end{center}
\clearpage
\question Intéressons-nous à l'arithmétique de pointeurs. On considère \CD{p} un pointeur qui \emph{pointe} sur un tableau \CD{a}:
\begin{lstlisting}
int a[] = {4, 8, 15, 16, 23, 42, 66, 104, 162};
int *p = a;
\end{lstlisting}
Quelles sont les valeurs ou adresses que fournissent ces expressions ?
\begin{parts}
\setlength\fillinlinelength{8cm}
\part \CD{*p+2}\hfill\fillin[6]
\part \CD{*(p+2)}\hfill\fillin[15]
\part \CD{&a[4]-3}\hfill\fillin[L'adresse de l'élément \CD{a[1]}]
\part \CD{a + 3}\hfill\fillin[L'adresse de l'élément \CD{a[3]}]
\part \CD{&a[7]-p}\hfill\fillin[7]
\part \CD{p+(*p-10)}\hfill\fillin[L'adresse de l'élément \CD{a[2]}]
\part \CD{*(p+*(p+4)-a[3])}\hfill\fillin[104]
\part \CD{(p+1)[2]}\hfill\fillin[16]
\part \CD{5[p] // wtf}\hfill\fillin[42]
\part \CD{(uintptr_t)(p + 3) - (uintptr_t)a}\hfill\fillin[12 (bytes)]
\part \CD{(&a)[1][-1]}\hfill\fillin[162]
\end{parts}
\question Écrire une fonction qui respecte le prototype ci-dessous. Cette fonction copie une chaîne de caractère de la source vers la destination.
\begin{lstlisting}
void strcpy(char *dest, const char *src);
\end{lstlisting}
Ne pas utiliser de boucle for, ni d'accès tableaux (\CD{a[b]}). Utilisez une boucle \CD{while} et l'arithmétique de pointeurs.
\begin{solutionordottedlines}[8cm]
\begin{lstlisting}
void strcpy(char *dest, const char *src)
{
char *p = dest;
while (*src)
*p++ = *src++;
*p = '\0';
}
\end{lstlisting}
\end{solutionordottedlines}
\end{questions}
\end{document}