matematykaszkolna.pl
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