Jeśli chodzi o wskaźnik to on pokazuje adres zmiennej czy za zmienną?

- Rejestracja:około 8 lat
- Ostatnio:minuta
- Postów:4887
Hm... Wartością wskaźnika jest adres adres jakiejś zmiennej, w tym sensie, odpowiedź na Twoje pytanie będzie wskazuje adres.
https://www.tutorialspoint.com/cprogramming/c_pointers.htm

- Rejestracja:ponad 13 lat
- Ostatnio:około 11 godzin
- Lokalizacja:Tuchów
- Postów:12165
Wskaźnik jest liczbą określającą lokalizację danych w pamięci, na które wskazuje. Sam też gdzieś w pamięci istnieje. Możesz więc wyświetlić adres wskaźnika, adres danych na jakie wskazuje lub same dane, na które wskazuje.
Wyszło trochę „masło maślane”, ale raczej wiadomo o co chodzi.

- Rejestracja:ponad 13 lat
- Ostatnio:około 11 godzin
- Lokalizacja:Tuchów
- Postów:12165
Jeśli wszystkie komórki tablicy stanowią jeden zwarty blok w pamięci – a tak jest – to bez żadnego problemu. Musisz tylko wiedzieć ile razy inkrementować wskaźnik, tak aby nie wyjść poza zakres tablicy.
Ewentualnie trzymać znacznik końca danych w ostatniej jej komórce (np. o wartości 0
), aby wiedzieć kiedy się zatrzymać. Taki sposób wykorzystywany jest w przypadku ciągów znaków, gdzie ostatnim znakiem musi być null
.

- Rejestracja:ponad 13 lat
- Ostatnio:około 11 godzin
- Lokalizacja:Tuchów
- Postów:12165
Następny za ostatnim to już poza tablicą – odczytasz śmieciowe wartości i kod może działać nieprzewidywalnie. Co prawda nie musi, jednak nie ma żadnej gwarancji, że bajt tuż za tablicą będzie zawierać spodziewaną wartość.

- Rejestracja:prawie 12 lat
- Ostatnio:2 dni
- Lokalizacja:Szczecin
Render125 napisał(a):
A w języku C/C++?
explicite to słowo, nie nazwa języka. C i C++ to różne języki, oba na to jasno, wyraźnie i celowo zezwalają.

- Rejestracja:ponad 13 lat
- Ostatnio:około 11 godzin
- Lokalizacja:Tuchów
- Postów:12165
Przykładowe śmignięcie po prostej tablicy znaków może wyglądać tak:
#include <iomanip>
int main()
{
char string[10] = {'R','e','n','d','e','r','1','2','5',0};
for(char *character = &string[0]; *character != 0; character++)
printf("%c", *character);
}
Nie ma odwoływania się do indeksów tablicy string
, nie ma też iterowania określoną ilość razy. Wskaźnik inkrementowany jest dotąd, aż będzie wskazywał na znak o kodzie 0
, dlatego jest on wymagany w ostatniej komórce tablicy. Rezultatem działania tej pętli będzie wyświetlenie w konsoli ciągu znaków, bez zerowego bajtu znacznika:
Render125
Gdyby go nie było, to pętla leciałaby dalej (poza rozmiar tablicy) i czytała śmieci z pamięci dotąd, aż przypadkowo trafiłaby na bajt 0
. Możesz to sprawdzić, usuwając ostatnią komórkę z tablicy:
#include <iomanip>
int main()
{
char string[9] = {'R','e','n','d','e','r','1','2','5'};
for(char *character = &string[0]; *character != 0; character++)
printf("%c", *character);
}
Przykładowy rezultat takiego wywołania niżej:
Render125@
Dwa śmieciowe bajty za tablicą zawierają wartości różne od zera (jednego nie widać w polu wyżej – taki znak się trafił), a trzeci zawiera 0
i dopiero wtedy pętla zakończyła działanie.
Render125 napisał(a):
Znaczy w zadaniu mam […]
Nie wiemy jakie masz zadanie, bo nie podałeś jego treści.

&string[0]
można zamienić na &*string
lub po prostu string
w tym kontekście :)




- Rejestracja:ponad 13 lat
- Ostatnio:około 11 godzin
- Lokalizacja:Tuchów
- Postów:12165
if(max>*c++)
Za bardzo kombinujesz. Najpierw powinieneś napisać dłuższy kod który działa, a dopiero później ewentualnie zająć się jego skróceniem. Poza tym podajesz za mały fragment kodu – nie wiadomo czym jest c
i skąd bierze się jego początkowa wartość.
Jeśli podajesz problematyczny kawałek kodu, to powinien on dać się skopiować i uruchomić lokalnie.
- Rejestracja:prawie 7 lat
- Ostatnio:ponad 3 lata
- Postów:157
int x,y;
cout<<"Podaj zakres"<<endl;
cin>>x;
cout<<endl;
cin>>y;
cout<<endl;
int *b=&t[x-1];
int *e=&t[y-1];
int suma=0;
while(b<=e)
{
cout<<*b<<endl;
suma=suma+(*b);
b++;
}
cout<<"Suma wynosi "<<suma<<endl;
for(int j=x; j<=y; j++)
{
if(max>*c++)
{
max=*c;
}
}
- Rejestracja:prawie 7 lat
- Ostatnio:ponad 3 lata
- Postów:157
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
int t[10];
for (int i = 0; i < 10; i++) {
t[i] = (rand() % 50) + 5;
}
int x, y;
cout << "Podaj zakres" << endl;
cin >> x;
cout << endl;
cin >> y;
cout << endl;
int* b = &t[x - 1];
int* e = &t[y - 1];
int suma = 0;
while (b <= e) {
cout << *b << endl;
suma = suma + (*b);
b++;
}
cout << "Suma wynosi " << suma << endl;
for (int j = x; j <= y; j++)
{
if (max > *c++) {
max = *c;
}
}
return 0;
}

- Rejestracja:prawie 12 lat
- Ostatnio:2 dni
- Lokalizacja:Szczecin
Mi nie podoba się ten fragment:
int* b = &t[x - 1];
int* e = &t[y - 1];
int suma = 0;
while (b <= e) {
cout << *b << endl;
suma = suma + (*b);
b++;
}
Jeśli chcę zsumować pierwsze cztery elementy tablicy, to oczekuję, że na zapytanie "Podaj zakres" odpowiem [0,4)
. Czyli tutaj to by było:
// x = 0
// y = 4
int* b = &t[x]; // alternatywna forma: t+x
int* e = &t[y]; // alternatywna forma: t+y
int suma = 0;
while (b < e) {
cout << *b << endl;
suma = suma + (*b);
b++;
}


uniform_int_distribution
itd).

<a,b)

- Rejestracja:ponad 13 lat
- Ostatnio:około 11 godzin
- Lokalizacja:Tuchów
- Postów:12165
Zmiennej d
w ogóle nie używasz, a zmienna max
nie jest zadeklarowana. Kod sypie błędami – http://cpp.sh/7ou4n