Zrozumienie tablic i wskaźników w języku C z przejrzystymi i praktycznymi przykładami

Ostatnia aktualizacja: 27/05/2025
Autor: Isaac
  • Tablice i wskaźniki są ze sobą ściśle powiązane w języku C i w wielu scenariuszach można je stosować równoważnie.
  • Arytmetyka wskaźników pozwala na wydajne i elastyczne przeglądanie tablic.
  • Wskaźniki są niezbędne do zaawansowanej manipulacji pamięcią i przekazywania parametrów przez odniesienie.
  • Ciągi znaków w języku C to tablice znaków zakończone znakiem null '\0'.

c

Jeśli dopiero zaczynasz przygodę z językiem C lub programujesz już od jakiegoś czasu i wciąż nie rozumiesz pojęć wskaźników i tablic, nie jesteś sam. Te dwa fundamentalne elementy języka C często powodują zamieszanie, zwłaszcza że ich działanie może wydawać się podobne, ale istnieją między nimi kluczowe różnice. W tym artykule szczegółowo omówimy te koncepcje, z jasnymi wyjaśnieniami i prostymi przykładami, które pomogą Ci je opanować raz na zawsze.

Dzięki tym materiałom dowiesz się, jak wskaźniki pozwalają na bardziej elastyczne i wydajne zarządzanie pamięcią , nauczysz się korzystać z tablic zmiennych i wskaźników oraz odkryjesz, jak to wszystko działa w przypadku funkcji, ciągów znaków i bardziej złożonych struktur. Wszystko jest wyjaśnione w naturalny, praktyczny i prosty sposób.

Czym jest wskaźnik w języku C?

wskaźnik w c

Wskaźnik w języku C to zmienna przechowująca adres pamięci innej zmiennej . Zamiast przechowywać wartość bezpośrednio, przechowuje lokalizację tej wartości w pamięci.

Podstawowa składnia deklaracji wskaźnika jest następująca:

int variable;
int *puntero = &variable;

Gdzie & jest operatorem pobierającym adres pamięci, a * służy do dostępu do zawartości adresu wskazywanego (lub dereferencji).

Na przykład:

int valor = 10;
int *p = &valor;
printf("%d", *p); // Imprime 10

Spowoduje to wydrukowanie zawartości adresu zapisanego w p , która jest wartością zmiennej value.

Arytmetyka wskaźnika

Jedną z najpotężniejszych cech wskaźników jest to, że możemy wykonywać na nich operacje arytmetyczne. Dzieje się tak, ponieważ wskaźnik wskazuje na adres pamięci, a poprzez inkrementację lub dekrementację tego wskaźnika, zmienia się jego pozycja , uwzględniając rozmiar typu danych, na który wskazuje.

int array = {5, 10, 15};
int *ptr = array;

printf("%d", *(ptr + 1)); // Imprime 10

Dzięki takiemu zachowaniu przeglądanie tablicy za pomocą wskaźnika staje się bardzo proste i efektywne.

  Zmiana kolejności rozruchu w Menedżerze rozruchu systemu Windows krok po kroku

Podstawowe operacje, które możesz wykonać to:

  • Zadanie: int *ptr = array;
  • Dereferencja: *ptr zwraca wartość zawartą w adresie
  • Zwiększać: ptr++ przejdź do następnego elementu
  • Odejmowanie: pozwala poznać odległość między dwoma wskaźnikami

Tablice w C

tablica w c

Tablica w języku C to zbiór elementów tego samego typu, zlokalizowanych w kolejnych lokalizacjach pamięci . Deklarując tablicę jako:

int numeros = {1, 2, 3, 4, 5};

Wewnętrznie elementy są wyrównywane jeden po drugim w pamięci. Nazwa tablicy, na przykład „numbers” , reprezentuje stałą wskazującą adres pierwszego elementu. To znaczy:

numeros == &numeros

Z tego powodu możliwe jest użycie wskaźników do dostępu do elementów tablicy . Umożliwia to stosowanie takich technik, jak przechodzenie przez tablicę za pomocą wskaźnika:

int *ptr;
for(ptr = numeros; ptr < numeros + 5; ptr++) {
    printf("%d ", *ptr);
}

Co jest dokładnie tym samym, co zrobienie tego z indeksami.

Relacja między wskaźnikami i tablicami

Związek między tablicami i wskaźnikami jest tak ścisły, że łatwo je pomylić. Mimo że technicznie rzecz biorąc tablica nie jest wskaźnikiem, zachowuje się bardzo podobnie do wskaźnika użytego na przykład jako parametr funkcji.

void imprimir(int *arr, int n) {
    for(int i = 0; i < n; i++) {
        printf("%d ", arr);
    }
}

Tę funkcję można wywołać zarówno z tablicą, jak i wskaźnikiem, ponieważ podczas przekazywania tablicy do funkcji, tak naprawdę przekazywany jest adres jej pierwszego elementu.

Ciągi znaków w języku C

W języku C ciąg znaków to po prostu tablica znaków typu char, zakończona znakiem specjalnym „\0” (znak null). Oznacza to koniec ciągu znaków.

Na przykład:

char saludo[] = "Hola";

Jest to równoważne:

char saludo[] = {'H', 'o', 'l', 'a', '\0'};

Ten znak null umożliwia funkcje takie jak strlen() wiedząc kiedy przestać.

Typowym sposobem deklarowania ciągu znaków jest użycie wskaźnika:

char *mensaje = "Mensaje de prueba";

Należy zachować ostrożność przy tym podejściu, ponieważ wskazywany ciąg znaków może znajdować się w segmencie pamięci przeznaczonym tylko do odczytu, co uniemożliwi modyfikację jego zawartości.

  Windows 11 nie instaluje obrazu ISO: przyczyny i skuteczne rozwiązania

Wskaźniki funkcji

Bardziej zaawansowanym, ale bardzo użytecznym podejściem jest użycie wskaźników do funkcji . W C możliwe jest przechowywanie adresu funkcji we wskaźniku, a następnie wywoływanie jej za jego pośrednictwem. Jest to szczególnie przydatne w strukturach takich jak wywołania zwrotne czy algorytmy generyczne.

int suma(int a, int b) {
    return a + b;
}

int (*operacion)(int, int);
operacion = suma;
printf("%d", operacion(5, 3)); // Imprime 8

Rozwiązanie to zapewnia dużą elastyczność i jest powszechnie stosowane w takich strukturach, jak menu interaktywne lub struktury sterowane zdarzeniami.

Tablice wskaźników

Tablica wskaźników to po prostu kolekcja wskaźników , tzn. każdy element tablicy jest wskaźnikiem do adresu pamięci.

int a = 1, b = 2, c = 3;
int *arr_punteros;
arr_punteros = &a;
arr_punteros = &b;
arr_punteros = &c;

Dzięki temu możesz uzyskać dostęp do takich wartości jak:

printf("%d", *arr_punteros); // Imprime 1

Używa się tego często do pracy z ciągami tekstowymi, np. w tablicach ciągów:

char *mensajes[] = {"Hola", "Mundo", "Adiós"};

I zapętlając to:

for(int i = 0; i < 3; i++) {
    printf("%s\n", mensajes);
}

Używanie wskaźników w funkcjach

W języku C funkcje otrzymują argumenty przez wartość , co oznacza, że ​​pracujesz z kopią. Jeśli chcesz zmodyfikować oryginalną wartość zmiennej z poziomu funkcji, musisz przekazać wskaźnik do tej zmiennej.

void cambiar(int *x) {
    *x = 100;
}

Nazywając to w ten sposób:

int valor = 50;
cambiar(&valor);
printf("%d", valor); // Imprime 100

Parametry wiersza poleceń

W języku C programy mogą otrzymywać argumenty w czasie wykonywania. Osiąga się to za pomocą parametrów argc y argv[] w funkcji main(). Dodatkowo możesz sprawdzić jak Użyj wskaźników w funkcjach, aby zarządzać argumentami i ulepsz swój kod.

int main(int argc, char *argv[]) {
    for(int i = 0; i < argc; i++) {
        printf("Argumento %d: %s\n", i, argv);
    }
}

argc wskazuje, ile argumentów zostało przekazanych i argumentacja jest tablicą wskaźników do char zawierający argumenty jako ciągi znaków.