Die Mathe-Redaktion - 23.07.2019 18:03 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktAnmeldung MPCT Sept.
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 499 Gäste und 23 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C : Wieso kein Pointer als Aktualparameter bei Übergabe an Hilfsfunktion?
Druckversion
Druckversion
Autor
Schule J C : Wieso kein Pointer als Aktualparameter bei Übergabe an Hilfsfunktion?
Zrebna
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 25.09.2018
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2019-05-15


Hi!

Hier erstmal folgender Code:
C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void betrag(int* zahl);
  5. void sort(int* a, int* b);
  6. void runde_summe(int* a, int* b, int* c, int* summe);
  7.  
  8.  
  9. int main() {
  10. int x, y, z, summe;
  11.  
  12. scanf("%d %d %d", &x, &y, &z);
  13.  
  14. runde_summe(&x, &y, &z, &summe);
  15. printf("%d", summe);
  16.  
  17. return 0;
  18. }
  19.  
  20.  
  21. void betrag(int* zahl) {
  22. if (*zahl < 0) {
  23. *zahl = (-1) * *zahl;
  24. }
  25. }
  26.  
  27. void sort(int* a, int* b) {
  28. if (*a > *b) {
  29. int temp;
  30. temp = *a;
  31. *a = *b;
  32. *b = temp;
  33. }
  34. }
  35.  
  36. void runde_summe(int* a, int* b, int* c, int* summe) {
  37. int last_digit;
  38.  
  39. betrag(a);
  40. betrag(b);
  41. betrag(c);
  42.  
  43. while (*a > *b || *b > *c) {
  44. sort(a, b);
  45. sort(b, c);
  46. }
  47.  
  48. *summe = *a + *b + *c;
  49. last_digit = *summe % 10;
  50.  
  51. if (last_digit >= 5) {
  52. *summe += 10 - last_digit;
  53. } else {
  54. *summe -= last_digit;
  55. }
  56. }
  57.  

Meine Frage lautet, wieso bei Zeilen 39-41 und bei Zeilen 44-45 bei der Übergabe der Pointer das "Sternsymbol" weggelassen wird?


edit:
ich sehe gerade, dass hier im Forum keine Zeilenangaben übergeben werden.
Ich poste daher von den betreffenden Stellen ein Bild:






  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2088
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2019-05-15


Das Sternchen dient der Dereferenzierung.
Die Funktionen erwarten allerdings Pointer.

Edit:
Der Befehl "\numberson" im Quelltextbereich generiert Zeilenangaben.


Minimalbeispiel zur Veranschaulichung:
C
  1. #include <stdio.h>
  2.  
  3. void print_ptr(int *a);
  4. void print_int(int a);
  5.  
  6. int main()
  7. {
  8. int x = 3;
  9. int *to_x = &x;
  10.  
  11. print_ptr(to_x);
  12. print_int(x);
  13.  
  14. return 0;
  15. }
  16.  
  17. void print_ptr(int *a){
  18. printf("%d\n",*a);
  19. }
  20.  
  21. void print_int(int a){
  22. printf("%d\n",a);
  23. }
  24.  



-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



  Profil  Quote  Link auf diesen Beitrag Link
Buri
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 02.08.2003
Mitteilungen: 45933
Aus: Dresden
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2019-05-15


Hi Zrebna,
es ist alles in Ordnung.
Die Argumente der Funktion runde_summe sind schon Pointer, und man kann diese unverändert an die Funktion betrag bzw. summe übergeben.
Gruß Buri



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26809
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2019-05-16


Hi Zrebna

Nochmal zur Verdeutlichung:

Die Funktion Betrag erwartet die Adresse einer Variablen. Nur so kann sie den Wert auch verändern.
Mit int* zahl zeigt der Pointer zahl auf die Variable, die im aufrufenden Programm definiert ist. Der Ausdruck *zahl arbeitet also mit der Variablen aus dem aufrufenden Programm. Nur so ist es möglich, diesen Wert auch zu verändern (hier: ein negatives Vorzeichen umkehren; was nebenbei gesagt, auch etwas eleganter geht: statt *zahl = (-1) * *zahl; genügt auch *zahl = -*zahl;).
Das aufrufende Programm ist hier runde_summe, das selbst schon gar keine Werte bekommt, sondern Pointer darauf. Und mit
Betrag(a);
wird dieser Pointer einfach an Betrag weiter gereicht.
Ein Aufruf
Betrag(*a);
würde jedoch den Wert von a übergeben, was die Funktion Betrag aber gar nicht haben will.

Gruß vom ¼



-----------------
Bild



  Profil  Quote  Link auf diesen Beitrag Link
Zrebna
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 25.09.2018
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2019-05-18


2019-05-16 00:30 - viertel in Beitrag No. 3 schreibt:
Hi Zrebna

Nochmal zur Verdeutlichung:

Die Funktion Betrag erwartet die Adresse einer Variablen. Nur so kann sie den Wert auch verändern.
Mit int* zahl zeigt der Pointer zahl auf die Variable, die im aufrufenden Programm definiert ist. Der Ausdruck *zahl arbeitet also mit der Variablen aus dem aufrufenden Programm. Nur so ist es möglich, diesen Wert auch zu verändern (hier: ein negatives Vorzeichen umkehren; was nebenbei gesagt, auch etwas eleganter geht: statt *zahl = (-1) * *zahl; genügt auch *zahl = -*zahl;).

ah stimmt, danke!

Das aufrufende Programm ist hier runde_summe, das selbst schon gar keine Werte bekommt, sondern Pointer darauf. Und mit
Betrag(a);
wird dieser Pointer einfach an Betrag weiter gereicht.
Ein Aufruf
Betrag(*a);
würde jedoch den Wert von a übergeben, was die Funktion Betrag aber gar nicht haben will.
Den Wert von a, oder den Wert auf den a zeigt?

Gruß vom ¼


Danke schon mal und auch an die beiden anderen Kommentare:)



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26809
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2019-05-20


2019-05-18 13:52 - Zrebna in Beitrag No. 4 schreibt:
2019-05-16 00:30 - viertel in Beitrag No. 3 schreibt:
Ein Aufruf
Betrag(*a);
würde jedoch den Wert von a übergeben, was die Funktion Betrag aber gar nicht haben will.
Den Wert von a, oder den Wert auf den a zeigt?

Verflixt frown
Natürlich den Wert, auf den a zeigt



  Profil  Quote  Link auf diesen Beitrag Link
Zrebna hat die Antworten auf ihre/seine Frage gesehen.
Zrebna hat selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]