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

[C] Arytmetyka wskaźników

Object Storage Arubacloud
0 głosów
1,678 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ź 248 wizyt
0 głosów
1 odpowiedź 643 wizyt
pytanie zadane 6 lipca 2015 w C i C++ przez mrcnsct Nałogowiec (36,390 p.)
0 głosów
0 odpowiedzi 121 wizyt
pytanie zadane 1 kwietnia 2022 w C i C++ przez piter11251 Obywatel (1,280 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...