notebook/notes/c17/declarations.md

12 KiB

title TARGET DECK FILE TAGS tags
Declarations Obsidian::STEM c17
c17

Overview

C declarations were designed so that the declaration of an object looks like the use of the object. This isn't quite true - keywords like volatile and const only exist in declarations - but for the most part, this philosophy can be leveraged to read C declarations.

Declarators

A declarator in C is roughly an identifier along with pointers, function brackets, or array indications. Pointers will look like one of:

  • *
  • * const
  • * volatile
  • * const volatile
  • * volatile const

whereas direct declarators will look like one of:

  • identifier
  • identifier[size]
  • identifier(args)
  • (declarator)

%%ANKI Basic What two qualifiers can be used in a pointer declaration? Back: const and volatile. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

Declarations

A declaration consists of at least one type-specifier (e.g. signed short), storage class (e.g. static), and/or type qualifier (e.g. const) as well as one or more declarators.

%%ANKI Basic How many declarators does a declaration have? Back: At least one. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic How many declarations does a declarator have? Back: N/A. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic Which part of the following are declarators?

int* a, b;

Back: * a and b. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic Which part of the following are declarations?

int* a, b;

Back: The entire line is a single declaration. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic Which part of the following declaration is the declarator?

const int *const x;

Back: *const x Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic Which part of the following declaration is the type specifier?

const int *const x;

Back: int Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic Which part of the following declaration is the type qualifier?

const int *const x;

Back: The first const. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of x in the following?

const int *const x, y;

Back: const int* const Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of y in the following?

const int *const x, y;

Back: const int Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of x in the following?

#define int_ptr int *
int_ptr x, y;

Back: int * Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of y in the following?

#define int_ptr int *
int_ptr x, y;

Back: int Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of x in the following?

typedef int_ptr int *
int_ptr x, y;

Back: int * Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of y in the following?

typedef int_ptr int *
int_ptr x, y;

Back: int * Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

Declarations can be read by complying with the precedence rules outlined below:

  1. Find the name of the declaration.
  2. Obey the following precedence rules:
    1. Parentheses grouping together parts of a declaration
    2. Postfix operators () and []
    3. Prefix operator: the asterisk * denoting "pointer to"
  3. If const and/or volatile keyword is next to a type specifier, it applies to the type specifier. Otherwise it applies to the pointer asterisk on its immediate left.

%%ANKI Basic In the precedence rules for C declarations, what available postfix operators are there? Back: () and []. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic In the precedence rules for C declarations, what available prefix operators are there? Back: Just *. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic In the precedence rules for C declarations, what available type qualifiers are there? Back: const and volatile. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

char *const *(*foo)();

Back: A pointer to a function returning a pointer to a const pointer-to-char. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

char *const *foo();

Back: A function returning a pointer to a const pointer-to-char. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

int (*(*foo)(void))[3]

Back: A pointer to a function (accepting void) returning a pointer to an array (size 3) of ints. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

const int (* volatile foo)[64]

Back: A volatile pointer to an array (size 64) of const ints. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

const int * const foo;

Back: A const pointer to a const int. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

const int * foo;

Back: A pointer to a const int. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

int const * foo;

Back: A pointer to a const int. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

int * const foo;

Back: A const pointer-to-int. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

char *(*foo[10])(int **);

Back: An array (size 10) of pointers to functions (accepting int **) returning pointer-to-char. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of signal in the the following declaration?

void (*signal(int sig, void (*func)(int)))(int);

Back: A function (accepting an int and void (*)(int)) returning a pointer to a function (accepting an int) returning void. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

Initializers

An initializer is an expression that gives an object a value at time of declaration. Only variable-length arrays (VLAs) do not allow for an initializer. The default initializer looks like {0}.

%%ANKI Basic Which part of the following are initializers?

int a = 3;

Back: 3 Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic Which part of the following are initializers?

double a = { 7.0 };

Back: { 7.0 } Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic Which part of the following are initializers?

double a = { 7.0 };

Back: { 7.0 } Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020). END%%

%%ANKI Basic How is the following updated to include initializers 1 and 2 for a and b respectively?

int a, b;

Back:

int a = 1, b = 2;

Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic What object types allow initializers? Back: All but VLAs. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic What object types do not allow initializers? Back: Just variable-length arrays. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic What is the default initializer? Back: {0} Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic {0} is a valid initializer for what object types? Back: All but VLAs. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic {0} is not a valid initializer for what object types? Back: Just variable-length arrays. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

Bibliography

  • Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
  • “ISO: Programming Languages - C,” April 12, 2011, https://port70.net/~nsz/c/c11/n1570.pdf.
  • Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
  • Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.