Inicjalizacja „wskaźnika do tablicy liczb całkowitych”


int (*a)[5];

Jak możemy zainicjować wskaźnik do tablicy 5 liczb całkowitych pokazanej powyżej.
Czy poniższe wyrażenie jest poprawne?
int (*a)[3]={11,2,3,5,6};

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Załóżmy, że masz tablicę int o długości
5
jak
int x[5];

Następnie możesz wykonać
a = & amp; x;
int x[5] = {1};
int (*a)[5] = &x;

Aby uzyskać dostęp do elementów tablicy, należy:
(* a) [i]
(==
(* (& amp; x)) [i]
== (* & amp; x) [i] ==
x [i]
) nawiasy są potrzebne, ponieważ
[]
ma pierwszeństwo przed
* . (jednym z typowych błędów byłoby wykonanie[code]* a [i]
w celu uzyskania dostępu do elementów tablicy). [/code]Zrozum, o co prosiłeś o błąd w czasie kompilacji:
int (*a)[3] = {11, 2, 3, 5, 6};

To jest niepoprawne, a także niezgodność typów, ponieważ
{11,2,3,5,6}
można przypisać do
int a [5];
i przypisujesz < code> int (* a) [3] .
Dodatkowo,
Możesz zrobić coś takiego dla jednego wymiaru:
int *why = (int p[2]) {1,2};

Podobnie w przypadku 2D spróbuj tego (dzięki @

caf
https://stackoverflow.com/users/134633/caf
):
int (*a)[5] = (int p[][5]){ { 1, 2, 3, 4, 5 } , { 6, 7, 8, 9, 10 } };
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

{11,2,3,5,6}
jest

lista

inicjatory, a nie tablica, więc nie możesz jej wskazać. Wskaźnik tablicy musi wskazywać tablicę, która ma prawidłową lokalizację w pamięci. Jeśli tablica jest nazwaną zmienną lub tylko fragmentem przydzielonej pamięci, nie ma to znaczenia.
Wszystko sprowadza się do wybranego typu tablicy. Istnieją różne sposoby deklarowania tablic w języku C, w zależności od celu:
// plain array, fixed size, can be allocated in any scope
int array[5] = {11,2,3,5,6};
int (*a)[5] = &array;// compound literal, fixed size, can be allocated in any scope
int (*b)[5] = &(int[5]){11,2,3,5,6};// dynamically allocated array, variable size possible
int (*c)[n] = malloc( sizeof(int[n]) );// variable-length array, variable size
int n = 5;
int vla[n];
memcpy( vla, something, sizeof(int[n]) );// always initialized in run-time
int (*d)[n] = &vla;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

int a1[5] = {1, 2, 3, 4, 5};
int (*a)[5] = &a1;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

int vals[] = {1, 2};
int (*arr)[sizeof(vals)/sizeof(vals[0])] = &vals;

a następnie uzyskujesz dostęp do zawartości tablicy, jak w:
(*arr)[0] = ...

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się