zmiana wartosci wskaznika
mehh: C/C++
jak zwiększyc wartosc wskaznika o 1, ale nie uzywając zadnych zmiennych
#include <stdio.h>
int main(){
int *a=5; //jak zwiększyc o 1?
printf("%d",a);
return 0;
}
10 sty 18:35
Jakoob: A możesz używać funkcji void?
10 sty 18:44
Programista: Po pierwsze ten kod Ci się nie skompiluje, jak już to (jeżeli chcesz wypisać wartość a):
#include <stdio.h>
#include <stdlib.h>
int main() {
int *a = (int*)malloc(sizeof(int));
*a = 5;
printf("%d", *a);
free(a);
}
wynik 5
Po drugie zapewne chodzi Ci o zwiększenie wartości wskazywanej przez wskaźnik a nie samego
wskaźnika? W takim wypadku wystarczy samo ++(*a);
#include <stdio.h>
#include <stdlib.h>
int main() {
int *a = (int*)malloc(sizeof(int));
*a = 5;
++(*a);
printf("%d", *a);
free(a);
}
wynik 6
10 sty 18:50
Pytający:
Wartość wskaźnika czy wartość wskazywanego przez niego obiektu? To drugie:
int a=5;
int *p=&a;
++(*p);
10 sty 18:52
mehh: chodzi o to ze w calym zadaniu nie moge uzyc zmiennej.
10 sty 18:57
mehh: Chodzi raczej o cos prostego − 1 semestr
10 sty 18:59
Dziadek Mróz:
Najpierw pytanie podstawowe. Wiesz co to jest wskaźnik?
Mamy kod:
int a = 5; // Alokacja pod 0x0000
int b = 3; // Alokacja pod 0x0001
int *c = &a; // Alokacja pod 0x0002
Adres | 0x0000 | 0x0001 | 0x0002 | ...
int a | 5 | | | ...
int b | | 3 | | ...
int *c | | | 0x0000 | ...
Operator & wyciąga adres zmiennej:
&a = 0x0000
więc wskaźnik c zawiera adres do zmiennej a, wynika z tego, że wskaźniki są innego typu ale
zawierają ten sam rodzaj danej, czyli adres.
Operator * wyłuskuje ze wskaźnika wartość pod przechowywanym adresem
*c = *(0x0000) = a = 5
bo pod adresem 0x0000 znajduje się 5
Cięższe działo:
int **d = &c; // Alokacja pod 0x0003
Adres | 0x0000 | 0x0001 | 0x0002 | 0x0003 | ...
int a | 5 | | | | ...
int b | | 3 | | | ...
int *c | | | 0x0000 | | ...
int **d | | | | 0x0002 | ...
*d = c = 0x0002
*(*d) = *(c) = *(0x0000) = a = 5
Przykład wykorzystania w kodzie:
#include <iostream>
int main() {
int a = 5;
int b = 3;
int *c = &a;
int **d = &c;
std::cout << "&a: " << &a << " a: " << a << std::endl;
// &a: 0x0000 a: 5
std::cout << "&b: " << &b << " b: " << b << std::endl;
// &b: 0x0001 b: 3
std::cout << "&c: " << &c << " c: " << c << " *c: " << *c << std::endl;
// &c: 0x0002 c: 0x0000 *c: 5
std::cout << "&d: " << &d << " d: " << d << " *d: " << *d << " *(*d): " << *(*d) <<
std::endl;
// &d: 0x0003 d: 0x0002 *d: 0x0000 *(*d): 5
}
Operacje na wskaźnikach:
operacje na wskaźniku, przesunięcie o rozmiar typu wskazywanego, w naszym przypadku o 4, bo
sizeof(int) = 4
b++, ++b, b−−, −−b
b++, b = 0x0001
operacje na zawartości wskaźnika, zmiana wartości zmiennej a za pomocą wskaźnika
(*b)++, ++(*b), (*b)−−, −−(*b)
(*b)++, *b = 4, d = 4
https://repl.it/repls/PaleturquoiseIndolentMorayeel
11 sty 07:46