they are composed of instructions. Those instructions live in memory. in the assembly program, these are labeled. The label is an address, just like a label for a variable. In a higher level language, you typically wouldnt allow the user to just pass the raw function somewhere. You have to get its address. C makes it so that the bare name refers to label (which is inconsistent with variable names which give you the value). I believe rust has actual separate function types in this way. iirc each function in rust you define is its own unique type since they will all have different sizes in memory.