What is the difference between C constants and C literals?

TL;DR: In C, literals (of which there are only string literals) are lvalues; we can take their address. All other “literals” (numbers, characters) are constants in C; this means they are rvalues and we cannot take their address.

In languages other than C, I tend to use “constant” and “literal” interchangeably. In C, they mean different things.

// Some constants
int i = 5;        // `5` is a constant
char c = 'x';     // `x` is a constant
uint64_t j = 45;  // `45` is a constant
char * s = NULL;  // `NULL` is a constant

// Some literals (actually, just string literals)
char * str = "hello";  // "hello" is a string literal

A literal is an lvalue: an expression with an address. This is why we have “string literals” and not “string constants”. The string literal is allocated in memory; we can take its address.

A constant is an rvalue: an expression without an address. Numbers and characters are literals. Taking the address of 45 has no meaning.

I just released Vidrio, a free app for macOS and Windows to make your screen-sharing awesomely holographic. Vidrio shows your webcam video on your screen, just like a mirror. Then you just share or record your screen with Zoom, QuickTime, or any other app. Vidrio makes your presentations effortlessly engaging, showing your gestures, gazes, and expressions. #1 on Product Hunt. Available for macOS and Windows.

With Vidrio

With generic competitor

More by Jim

Tagged . All content copyright James Fisher 2017. This post is not associated with my employer. Found an error? Edit this page.