The foregoing answers overlook an important distinction between const and static const, which is that the former generates a set of mov instructions to initialize the variables at runtime, whereas the latter generates data stored at fixed addresses that gets baked into the object file.
For example, say we have the following array of strings.
static const char * lpchrTestFiles [ ] =
{
"..\\..\\Test_Files\\uchrMessage1.TXT" ,
"..\\..\\Test_Files\\uchrMessage2a.TXT" ,
"..\\..\\Test_Files\\uchrMessage3.TXT"
} ; // static char * lpchrTestFiles [ ]
The string literals are always baked into the code. However, declaring the array of pointers as both static and const causes the compiler to generate an array of const pointers to the three strings, which are baked into the code.
If we eliminate the static keyword, leaving only const, the function prologue is immediately followed by three mov instructions that initialize a function scoped array of pointers, as shown in the following disassembly view taken from a Visual Studio debugging session.
203: const char * lpchrTestFiles [ ] =
204: {
205: "..\\..\\Test_Files\\uchrMessage1.TXT" ,
206: "..\\..\\Test_Files\\uchrMessage2a.TXT" ,
207: "..\\..\\Test_Files\\uchrMessage3.TXT"
208: } ; // static char * lpchrTestFiles [ ]
00EA1E00 mov dword ptr [lpchrTestFiles],offset string "..\\..\\Test_Files\\uchrMessage1.TX"... (0EA5584h)
00EA1E07 mov dword ptr [ebp-1Ch],offset string "..\\..\\Test_Files\\uchrMessage2a.T"... (0EA55A8h)
00EA1E0E mov dword ptr [ebp-18h],offset string "..\\..\\Test_Files\\uchrMessage3.TX"... (0EA55CCh)
Unless you like wasting machine instructions or must minimize the size of the on-disk code image file, static const generates much more efficient code.