Declare an array of pointers with an initializer if possible in generated C code
### Description

This issue is related to this:
https://github.com/nim-lang/Nim/issues/12216

Top level array type variables with initializers are translated to global array type variables with initializers in C lang when they are arrays of int.
But if they are arrays of pointers to int or function, they are translated to global array variables without initializer and initialized in the function.

Example code:
```nim
var
  foo = 123
  bar = 456
  cvar {.importc.}: cint

proc test0 = discard
proc test1 = discard

let
  # Array of int is translated to a C global variable with the initializer .
  intArray = [123, 456]

  # Following arrays are translated to C global variables without initializer.
  ptrIntArray = [foo.addr, bar.addr]
  ptrProcArray = [test0, test1]
  ptrProcArray2 = [cast[proc () {.nimcall.}](cvar.addr), test0]
```


### Nim Version

Nim Compiler Version 2.1.99 [Linux: amd64]
Compiled at 2024-09-12
Copyright (c) 2006-2024 by Andreas Rumpf

git hash: 793cee4de1934fd1f6271cf5fed46f01c5abb19b
active boot switches: -d:release


### Current Output

```text
N_LIB_PRIVATE NIM_CONST tyArray__HU7qaqKu9czJLT84iCBJnsA intArray__testinit_u6 = {((NI)123),
((NI)456)}
;

// Following variables are initialized in `NimMainModule` function
N_LIB_PRIVATE tyArray__GvHRlUg9a1sDoochCmNrKXg ptrIntArray__testinit_u7;
N_LIB_PRIVATE tyArray__DNFs9cfpFz9asZni0hv9amgOQ ptrProcArray__testinit_u8;
N_LIB_PRIVATE tyArray__DNFs9cfpFz9asZni0hv9amgOQ ptrProcArray2__testinit_u10;
```


### Expected Output

```text
N_LIB_PRIVATE NIM_CONST tyArray__HU7qaqKu9czJLT84iCBJnsA intArray__testinit_u6 = {((NI)123),
((NI)456)}
;

N_LIB_PRIVATE tyArray__GvHRlUg9a1sDoochCmNrKXg ptrIntArray__testinit_u7 = {(&foo__testinit_u1), (&bar__testinit_u2)};
N_LIB_PRIVATE tyArray__DNFs9cfpFz9asZni0hv9amgOQ ptrProcArray__testinit_u8 = {test0__testinit_u4, test1__testinit_u5};
N_LIB_PRIVATE tyArray__DNFs9cfpFz9asZni0hv9amgOQ ptrProcArray2__testinit_u10 = {((tyProc__T4eqaYlFJYZUv9aG9b1TV0bQ) ((&cvar))), test0__testinit_u4};
```


### Known Workarounds

Use emit pragma and write C global variables with initializer.

### Additional Information

Background:
I'm trying to translate this arm32 assebly code in [Raspberry Pi Pico SDK](https://github.com/raspberrypi/pico-sdk) to Nim code in order to write a Raspberry Pi Pico program without using Raspberry Pi Pico SDK (because using the SDK requires writing a CMake file):
https://github.com/raspberrypi/pico-sdk/blob/master/src/rp2_common/pico_crt0/crt0.S
This code runs before main function and contains the vector table.
The vector table is an array of pointers to functions (interrupt service routines, reset handler and etc) but the first element is the stack pointer.
The address of the stack pointer is set in [the linker script](https://github.com/raspberrypi/pico-sdk/tree/master/src/rp2_common/pico_crt0/rp2040).
The symbol `__StackTop` has the address of the stack and it is referenced in C as an external variable:
```c
extern int __StackTop;
void (*vectorTable[])(void) = {(void (*)())&__StackTop, resetHandler, isr, ...};
```
How to access a linker script defined variable from C code is explained here:
https://sourceware.org/binutils/docs/ld/Source-Code-Reference.html

The vector table is needed to be declared with the initializer so that it is placed on flash memory on Raspberry Pi Pico.

I think this issue is low prioprity as I can workaround it using emit pragma.