All data in a C program is conceptually in "memory". Each C type, T, needs a fixed amount of memory equal to sizeof(T), which gives the size in units of sizeof(char). Every "int" has the same size in memory. Every float has the same size. Every char has a size that's always 1, which is almost always equal to 1 byte or 8 bits. 200 floats probably have need 800 bytes of memory, and indeed it you did sizeof(averages), that's probably what you'd get.
So data takes up a specific block of memory, with a starting and ending location, with the difference between them equal to the size of the type. Getting the memory location is generally done via the & operator, though this is not always allowed. From the perspective of understanding the behavior of C code, all data is in memory.
That describes what memory is defined by the C language standard. But if you're curious about how memory is actually modeled by your PC, or if you're interested in making your code execute fast, there's more to know. C memory was designed to model the behavior of RAM, "Random Access Memory" on ancient computers. But that's not what memory really is. There are several reasons for this.
- Firstly, compilers may remove objects that you don't need for your program to work, so your compiled program may not have the same data as you explicitly write out. For example, if you write a long equation that contains only constants, chances are the compiler will just compute the result of that, and use it as a single object.
- Second, In addition to RAM, data can also be stored in CPU registers. These behave just like RAM, except there are very few of them. They are also very fast to access. In modern processors, registers are a piece of data with a small number attached. Compilers may chose to store any C object in registers, instead of the part of the computer that behaves like ancient RAM. Some CPUs require objects to be placed in registers before doing any computation on them. This also means that objects may be moved between memory and RAM. Non primitive types are often only partially moved into registers, as needed.
- Third, even objects that aren't eliminated by the compiler or put into registers aren't necessarily put onto RAM. They are instead part of what's called "virtual memory". "virtual" means that it behaves like memory, referring to the RAM on computers long ago. But modern RAM isn't used like that, it can be too small. To allow programs to use more memory, operating system controlled memory "pages" are used, which are stored onto the hard dive when they don't fit into your physical RAM, aka physical memory. Memory that's allocated but not written to may also not be loaded to physical memory.
- Fourth, modern memory, even when it's on a page that's loaded in physical memory, doesn't behave like ancient RAM in another way: it's cached. Because accessing RAM is relatively slow, your CPU will the data into the CPU before using it, and try to do as much as it can with the data on the CPU. There may be up to three levels of cache on the CPU, with smaller caches providing faster access to bigger caches, and the biggest cache providing access to memory.
Note this is in contradiction with the people above saying that C memory == virtual memory or C memory == RAM. Both of those are simplifications of what's really going on in your PC.