16 KiB
title | TARGET DECK | FILE TAGS | tags | |
---|---|---|---|---|
Pointers | Obsidian::STEM | c17::pointer |
|
Overview
Pointers have the same size as the machine's word size since it should be able to refer to any virtual address. All pointers are either valid, null, or indeterminate.
%%ANKI Basic Why does a pointer's size match the machine's word size? Back: Because it should be able to refer to any virtual address. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI Basic How is a pointer represented in binary? Back: N/A. This is implementation specific. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic What three states can a pointer be in? Back: Valid, null, or indeterminate. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
How is a pointer made null?
Back: By initializing or assigning the pointer to 0
.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
When does a pointer evaluate to false
?
Back: When it is a null pointer.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
When does a pointer evaluate to true
?
Back: When it is not a null pointer.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
Suppose a pointer logically evaluates to true
. Why might it still be unsafe to use?
Back: Logical evaluation can't distinguish valid pointers from indeterminate pointers.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic What is the result of dereferencing an indeterminate pointer? Back: Undefined behavior. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic What is the result of dereferencing a null pointer? Back: Undefined behavior. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
How is r->field
equivalently written using *
?
Back: (*r).field
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI
Basic
How is (*r).field
more compactly written?
Back: r->field
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI
Basic
How many members must be defined in a struct
initializer?
Back: One.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
Are struct
s passed by reference or value?
Back: Value.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
C allows arithmetic on pointers, where the computed value is scaled according to the size of the data type referenced by the pointer.
%%ANKI Basic How is the following (assumed valid) expression simplified?
*&E
Back: As just E
.
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI Basic How is the following (assumed valid) expression simplified?
&*E
Back: As just E
.
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI
Cloze
Pointer arithmetic {*(A + i)
} is equivalent to array reference A[i]
.
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI Basic How do we rewrite the return statement using pointer arithmetic?
int func() {
int A[3][4];
return A[1][2];
}
Back: return *(A + 6);
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI Basic How do we rewrite the return statement using pointer arithmetic?
int func() {
int A[3][4];
return A[2][0];
}
Back: return *(A + 8);
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI Basic How do we rewrite the return statement using pointer arithmetic?
int func() {
int A[4][3];
return A[1][2];
}
Back: return *(A + 5);
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI Basic How do we rewrite the return statement using pointer arithmetic?
int func() {
int A[4][3];
return A[1][0];
}
Back: return *(A + 3);
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI
Basic
How is the return
statement likely translated to x86-64?
int* func(int *E) { return E; }
Back:
movq %rdi,%rax
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: x86-64
END%%
%%ANKI
Basic
How is the return
statement likely translated to x86-64?
int func(int *E) { return E[0]; }
Back:
movl (%rdi),%eax
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: x86-64
END%%
%%ANKI
Basic
How is the return
statement likely translated to x86-64?
int func(int *E, int i) { return E[i]; }
Back:
movl (%rdi, %rsi, 4),%eax
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: x86-64
END%%
%%ANKI
Basic
How is the return
statement likely translated to x86-64?
int* func(int *E) { return &E[2]; }
Back:
leaq 8(%rdi),%rax
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: x86-64
END%%
%%ANKI
Basic
Suppose char *p
has address S
. What is the result of the following?
(int *) p + 7
Back: S + 28
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI
Basic
Suppose char *p
has address S
. What is the result of the following?
(int *) (p + 7)
Back: S + 7
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI
Basic
How do we declare a function pointer fp
to the following?
int foo(int x, int *p);
Back:
int (*fp)(int, int *);
Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI Basic What do the following two lines declare instances of?
int (*fp)(int, int *);
int *fp(int, int *);
Back: The first is a function pointer. The second is a function. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI Basic What is the value of a function pointer? Back: The address of the first instruction in the function's machine-code representation. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
END%%
%%ANKI Basic Trap representations are most relevant to what kind of derived type? Back: Pointers. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic What does a trap representation refer to? Back: An invalid interpretation of a bit pattern as a specific type. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic What happens when accessing an object with a trap representation of its type? Back: Undefined behavior. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Why must a dereferenced object have the correct designated type? Back: A trap representation of an object's type leads to undefined behavior. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Refer to the following. Why isn't the pointer addition considered correct?
double A[2] = { 0.0, 1.0 };
double* p = &A[0] + 2;
Back: N/A. It is. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Refer to the following. Why isn't the pointer addition considered correct?
double A[2] = { 0.0, 1.0 };
double* p = &A[0] + 3;
Back: Pointers cannot refer to addresses beyond that immediately following the array. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
Refer to the following. What values of N
yield a valid pointer assignment?
double A[2] = { 0.0, 1.0 };
double* p = &A[N];
Back: 0
, 1
, and 2
.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
Refer to the following. What is the first value of N
that yields an invalid pointer assignment?
double A[2] = { 0.0, 1.0 };
double* p = &A[N];
Back: 3
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Refer to the following. Is the last line a valid dereference?
double A[2] = { 0.0, 1.0 };
double a = *(&A[1]);
Back: Yes. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Refer to the following. Is the last line a valid dereference?
double A[2] = { 0.0, 1.0 };
double a = *(&A[2]);
Back: No. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Cloze A pointer must point to a {valid object}, or {one position beyond} a valid object, or be {null}. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Consider the following. At what point could the program crash?
double A[] = { 0.0, 1.0 };
double* p = &A[0] + 2;
double q = *p;
Back: On the third line. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Consider the following. At what point could the program crash?
double A[] = { 0.0, 1.0 };
double* p = &A[0] + 3;
double q = *p;
Back: On the second line. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
NULL
The NULL
macro refers to a null pointer constant, an ICE with value 0
or such an expression cast to type void*
. The following table lists some valid values NULL
can take on:
Expansion | Type |
---|---|
0U |
unsigned |
0 |
signed |
\0 |
signed |
Enum constant of value 0 |
signed |
0UL |
unsigned long |
0L |
signed long |
0ULL |
unsigned long long |
0LL |
signed long long |
(void*)0 |
void* |
%%ANKI
Basic
How are null pointer constants defined in terms of ICEs?
Back: As any ICE with value 0
or such an expression cast to type void*
.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
What must the NULL
macro expand to?
Back: Any null pointer constant.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Which of the following members of the list are ICEs?
0U, '\0', 0UL, (void*)0, 5LL
Back: 0U
, \0
, 0UL
, and 5LL
.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Which of the following members of the list are null pointer constants?
0U, '\0', 0UL, (void*)0, 5LL
Back: 0U
, \0
, 0UL
, and (void*)0
.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
Which of the following members of the list could NULL
be identical to?
0U, '\0', 0UL, (void*)0, 5LL
Back: 0U
, \0
, 0UL
, and (void*)0
.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Which of the following members of the list are pointer constants?
0U, '\0', 0UL, (void*)0, 5LL
Back: Just (void*)0
.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
Why does Gustedt discourage use of NULL
?
Back: The type of value it expands to is implementation-specific.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic What is wrong with the following invocation?
printf("%d, %p", 1, NULL);
Back: NULL
may not refer to a pointer type.
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI
Basic
What value must NULL
have for the following to be correct?
printf("%d, %p", 1, NULL);
Back: (void*)0
Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
Aliasing
Accessing the same object through different pointers is called aliasing. With the exclusion of simple#Character Types, only pointers of the same base type may alias.
%%ANKI Basic What does aliasing refer to? Back: Accessing the same object through different pointers. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Is aliasing possible in the following function?
void foo(double const* a, double* b);
Back: Yes. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
%%ANKI Basic Is aliasing possible in the following function?
void foo(double const* a, float* b);
Back: No. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
END%%
Bibliography
- Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).