notebook/notes/c17/pointers.md

16 KiB

title TARGET DECK FILE TAGS tags
Pointers Obsidian::STEM c17::pointer
c17

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 structs 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).