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?
Ehemaliges_Mitglied
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:






Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2245
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 -



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Buri
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 02.08.2003
Mitteilungen: 46153
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



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27298
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



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Ehemaliges_Mitglied
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:)



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27298
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 ☹️
Natürlich den Wert, auf den a zeigt



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Ehemaliges_Mitglied hat die Antworten auf ihre/seine Frage gesehen.
Ehemaliges_Mitglied 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-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. 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]