Adres pokazywany przez wskaźnik

0

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

2

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

1

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.

0

A czy jest możliwe wypisanie elementów tablicy za pomocą wskaźników nie używając indeksowania tablicy?

2

Pewnie że jest, C jest starsze od ludzi piszących na tym forum:), więc tony info Znajdziesz na necie.

1

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.

0

Do elementu "następnego za ostatnim" to tak jakby do ostatniego?

1

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ść.

0

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 ?

3

Możesz, język explicite na to zezwala.

5

A w języku C/C++?

1
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ą.

2

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);
}

http://cpp.sh/9step

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);
}

http://cpp.sh/8vssq

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.

0
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

0
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

2
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.

0
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;
 
   }
 
}


1

A czym jest t?

0

t to tablica

1

Ehh… podaj jej deklarację. A najlepiej to podaj cały kod, tak aby można go było sprawdzić lokalnie.

0
#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;
}
1

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.

2

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++;
    }
0
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

1

Zmiennej d w ogóle nie używasz, a zmienna max nie jest zadeklarowana. Kod sypie błędami – http://cpp.sh/7ou4n

1 użytkowników online, w tym zalogowanych: 0, gości: 1