more C notes

This commit is contained in:
Thomas Bishop 2026-01-20 17:36:48 +00:00
parent eb086f064b
commit 1f2c365a35
2 changed files with 95 additions and 1 deletions

View file

@ -67,7 +67,6 @@ already used which is string literal notation:
```c
char word[] = "Hello";
```
The null terminator is implied in this form, you do not need to add it manually.

95
zk/Functions_in_C.md Normal file
View file

@ -0,0 +1,95 @@
---
tags:
- C
---
## What type is a function?
A function does not have to a dedicated primitive type. It is a **derived**
type, meaning that its type-signature comes from the primitive types that it
uses.
On this basis, a function type is derived from its return type and the number
and types of its parameters.
E.g. for the function:
```c
int mimic_number(int num) {
return num;
}
```
It's type is a product of:
- its return type (`int`)
- the number of parameters (`1`)
- the type of its parameter (`int`)
## Function declarators and function definitions
In C, it is possible to declare a function without specifying the body, e.g:
```c
int f(void);
void g(int i, int j);
```
Are all examples of function declarators.
Later then you can go back and provide the definition. Note that this is just
the same as a normal full function declaration, it's just you've previously
declared its existence:
```c
int f(void);
// Some other code
int f(void) {
printf("Here's the definition.")
}
```
### What's the point of this?
The only real utility in distinguishing the declaration from the definition is
when creating reusable libraries.
These follow this sequence:
- define a `.h` header file with function declaration
- define a `.c` file with the function definition
- import the function into `main.c` and call function
Applied example:
```c
// math_utils.h
int add (int a, int b);
```
```c
// math_utils.c
int add (int a, int b) {
return a + b;
}
```
And then in `main.c`:
```c
#include "math_utils.h"
int main(void):
int sum = add(5, 3)
```
> The compiler compiles each .c file separately. The header file tells main.c
> that add and multiply exist somewhere, even though they're defined in a
> different file. The linker connects everything together at the end.
In C, the distinction between arguments and parameters is more acute than other
languages: