Jeśli chodzi o wskaźnik to on pokazuje adres zmiennej czy za zmienną?
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
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.
A czy jest możliwe wypisanie elementów tablicy za pomocą wskaźników nie używając indeksowania tablicy?
Pewnie że jest, C jest starsze od ludzi piszących na tym forum:), więc tony info Znajdziesz na necie.
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
.
Do elementu "następnego za ostatnim" to tak jakby do ostatniego?
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ść.
Znaczy w zadaniu mam zakres <a,b) a to wskaznik na początek a b na następny za ostatnim więc chyba trzeba wypisać do ostatniego ale nie jestem pewien czy mogę utworzyć wskaźnik na b ?
Możesz, język explicite na to zezwala.
A w języku C/C++?
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ą.
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.
int z,z1;
cout<<"Podaj zakres"<<endl;
cin>>z;
cout<<endl;
cin>>z1;
cout<<endl;
int *a=&t[z-1];
int *b=&t[z1-1];
while(a<=b)
{
cout<<*a<<endl;
a++;
}
Mój kawałek kodu
for(int j=x; j<=y; j++)
{
if(max>*c++)
{
max=*c;
}
}
Próbuje znaleźć max za pomocą wskaźników ale nie działa
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.
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;
}
}
A czym jest t
?
t to tablica
Ehh… podaj jej deklarację. A najlepiej to podaj cały kod, tak aby można go było sprawdzić lokalnie.
#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;
}
Program jest w miarę Ok, problem natomiast istnieje na jego końcu:
for(int j=x; j<=y; j++)
{
if(max>*c++)
{
max=*c;
}
}
Zmienna c
nie jest nigdzie zadeklarowana.
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++;
}
int* c = &t[x];
int* d = &t[y];
for(int j=x; j<=y; j++)
{
if(max>*c++)
{
max=*c;
}
}
Utworzyłem nowe wskaźniki bo tamte były przesunięte
Zmiennej d
w ogóle nie używasz, a zmienna max
nie jest zadeklarowana. Kod sypie błędami – http://cpp.sh/7ou4n