• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C] Arytmetyka wskaźników

VPS Starter Arubacloud
0 głosów
1,652 wizyt
pytanie zadane 3 kwietnia 2017 w C i C++ przez Kamil Duljas Użytkownik (990 p.)

Witam,

chciałbym zrozumieć pewne zachowanie wskaźników. Otóż poniższy program odwraca wprowadzony ciąg znaków:

#include <stdio.h>

int main()
{
    char *t="ABCD";
    char *s=t+3;
    while(s>=t)
    {printf("%c",*s);
    s=s-1;}
    puts("");
    return 0;
}

Moje pytanie brzmi: Dlaczego zamiana w poleceniu while z "t" na "4" powoduje wysypanie programu? Jak należy rozumieć warunek while? Wiem, że mam miejsce tutaj arytmetyka wskaźników, lecz nie mogę zrozumieć tego zachowania. Poniżej przykład kodu który wysypuje:

 

#include <stdio.h>

int main()
{
    char *t="ABCD";
    char *s=t+3;
    while(s>=4)
    {printf("%c",*s);
    s=s-1;}
    puts("");
    return 0;
}

 

2 odpowiedzi

+2 głosów
odpowiedź 3 kwietnia 2017 przez draghan VIP (106,230 p.)
Wypisz sobie wartość (adres, który przechowuje) wskaźnik s - wtedy (mam nadzieję) zrozumiesz sam. :)
0 głosów
odpowiedź 3 kwietnia 2017 przez Bondrusiek Maniak (61,370 p.)

Witam,

Co do Twojego problemy to musisz sobie przyswoić dwie informacje teoretyczne. Wskaźniki dają pośredni dostęp do adresu pamięci tzn. dobrze by było gdyby wskazywały na jakiś istniejący zasób a nie na jakiś przypadkowy obszar. Drugą rzeczą, którą musisz przyswoić jest indeksowanie tablic(wskaźników). W języku C/C++ numerujemy od 0 do n-1 długości tablicy więc:

char *t="ABCD";

/*1 element to */ printf("%c\n", *(t+0));

/*2 element to */ printf("%c\n", *(t+1));

/*3 element to */ printf("%c\n", *(t+2));

/*4 element to */ printf("%c\n", *(t+3));

/*5 elementu nie ma, printf("%c\n", *(t+4)); , łatwo to udowodnić po przeliczeniu znaków występujących w "ABCD"*/

 

Przeanalizuj ten kod. Mam nadzieje, że Ci pomoże:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char *t = "ABCD";
	char *s = t + 3;
	int i;
	for (i = 0; i < 4 ; ++i)
	{
		printf("Adress t (czyli dalej Wartosc adresu wskaznika %x) Wartosc t (Wartosc wskaznika %c)", t+3-i, *(t+3-i));
		puts("");
	}


	while (s >= t)
	{
		printf("Wartosc wskaznika : %c Wartosc adresu wskaznika: %x Adres wskaznika: %x", *s, s, &s);
		
		s = s - 1;
		puts("");
	}
	system("pause");
    return 0;
}

 

 

Podobne pytania

0 głosów
1 odpowiedź 243 wizyt
0 głosów
1 odpowiedź 623 wizyt
pytanie zadane 6 lipca 2015 w C i C++ przez mrcnsct Nałogowiec (36,390 p.)
0 głosów
0 odpowiedzi 118 wizyt
pytanie zadane 1 kwietnia 2022 w C i C++ przez piter11251 Obywatel (1,280 p.)

92,455 zapytań

141,263 odpowiedzi

319,100 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...