the environment and environment variables
Imagine starting a new job and being handed a small card of standing instructions: here is your desk, here is the language we speak, here is where the supply cabinet is. You did not negotiate these; they were simply set before you arrived, and you will pass the same card (perhaps lightly edited) to anyone you hire. A program's environment is exactly this card of named settings, handed to it at startup and inherited by the programs it launches.
Concretely, the environment is a set of named string values - environment variables - that the operating system makes available to a process when it starts, alongside its command-line arguments. Each variable is simply a name and a string value, like PATH=/usr/bin:/bin or HOME=/home/you or LANG=en_US.UTF-8. A C program reads them with getenv("NAME"), which returns the value string or NULL if unset, and the whole list is also available through a third parameter to main or the global variable environ. The key behavior is inheritance: when a process starts a child, the child receives a copy of the parent's environment, so settings flow down a tree of processes. The shell is usually where they are set - typing NAME=value before a command, or using export - and from there every program the shell starts can see them.
Why it matters: environment variables are a standard, lightweight channel for configuration that lives outside the program's code and command line. They are how the shell tells programs where to find executables (PATH), what language and locale to use (LANG), where the user's home directory is (HOME), and countless application-specific settings. Because they are inherited, a setting made once in your shell affects every program you then run. One honest caveat: the environment is plain inherited text with no access control, so it is the wrong place for true secrets in a hostile setting - any child process and often other tools can read it.
In a C program, char *home = getenv("HOME"); gives you the path string the shell put in the HOME variable, or NULL if it is not set. At the shell, running LANG=C ./prog launches prog with the LANG variable temporarily set to C, just for that one run.
getenv reads one variable; children inherit a copy of the whole environment.
The environment is inherited plain text with no protection - any child process can read it. It is fine for configuration like PATH or LANG, but it is not a secure vault for passwords or keys in an adversarial setting.