Forum: PC-Programmierung zeiger auf zeiger


von brechpunkt (Gast)


Lesenswert?

Ich hoffe das ist jetzt nichts peinliches, aber...

Mache ich einen normalen Zeiger wie hier,
1
char* arg;
... dann habe ich lediglich eine Variable, die auf einen Speicherbereich 
zeigt, diesen aber nicht in meiner Funktion initialisiert.

Nun möchte ich aber einen Zeiger auf einen Zeigber-Array haben:
1
char* arg[10];

Ist das nun das gleiche wie folgendes?
1
char arr[10];
2
char* arg = arr;

Oder ist es wiederum einfach nur ein Zeiger, der keinen weiteren 
Speicher reserviert hat?

: Verschoben durch Admin
von Peter II (Gast)


Lesenswert?

brechpunkt schrieb:
> char* arg[10];

ist ein Array von 10 Zeigern - die aber noch in "nichts" zeigen.

> Ist das nun das gleiche wie folgendes?
nein ist es nicht.

das ist ein Array von 10 zeichen.

von Chefkoch (Gast)


Lesenswert?

Mit
>char arr[10];
allokierst du zur Compilezeit Speicherbereich für 10 Char´s.
Der Ausdruck "arr" ohne einen index ist ein Zeiger auf Element 0 des
Arrays.

von Sebastian V. (sebi_s)


Lesenswert?

Chefkoch schrieb:
> Der Ausdruck "arr" ohne einen index ist ein Zeiger auf Element 0 des
> Arrays.

Nein arr ist der Bezeichner für ein Array. Allerdings zerfallen Arrays 
in den meisten Fällen zu Pointern, sodass man sie quasi als Pointer 
nutzen kann. Unterschiede gibts z.B. bei der Verwendung von sizeof 
(sizeof(arr) gibt die Größe des Arrays und sizeof(ptr) gibt nur die 
Größe des Pointers).

von Stefan F. (Gast)


Lesenswert?

char* arg[10];

Ist ein Array mit 10 Zeigern, die jeweils auf ein Zeichen zeigen.

char arr[10];
char* arg = arr;

Ist ein Array mit 10 Zeichen, sowie ein Zeiger auf das Array.

Bei Funkionsparametern sollte man wissen, dass char* und char[] 
identisch sind:

void printLine(char line[]) {...}

entspricht

void printLine(char *line) {...}

In beiden Fällen sind beide Zugriffsarten auf "line" korrekt:
1
char c=*line;
2
while (c != 0) 
3
{
4
   printChar(c);
5
   line++;
6
   c=*line;
7
}
1
int i=0;
2
char c=line[i];
3
while (c !=0)
4
{
5
   printChar(c);
6
   i++;
7
   c=line[i];
8
}

Sogar das ist Ok, allerdings schlecht lesbar (finde ich):
1
void printLine(char line[]) 
2
{
3
   while (*line != 0)
4
   {
5
      printChar(*(line++)); 
6
   }
7
}

von Lalala (Gast)


Lesenswert?

Vielleicht soetwas wie arg= char[1][10]; ?

von Daniel A. (daniel-a)


Lesenswert?

Stefan U. schrieb:
> void printLine(char line[])
> {
>    while (*line != 0)
>    {
>       printChar(*(line++));
>    }
> }

Zu lange!
1
void printLine(char* line){
2
  while (*line)
3
    printChar(*line++);
4
}

Der !=0 vergleich geht auch Implizit, und der postfox increment operator 
kommt vor dem indirection operator per default.

von GCC (Gast)


Lesenswert?

Daniel A. schrieb:
> void printLine(char* line){
>   while (*line)
>     printChar(*line++);
> }
Zu schlecht lesbar!
1
void printLine(char* line)
2
{
3
  while (*line)
4
    printChar(*line++);
5
}

von brechpunkt (Gast)


Lesenswert?

Danke für die vielen Antworten.

Wenn ich euch richtig verstanden habe, muss ich in meinem Fall dafür 
sorgen, dass der Speicherplatz initialisiert wird.

Ich wäre nun davon ausgegangen, dass es so richtig ist, bekomme aber 
eine Fehlermeldung:
1
char argArr[MAX_ARGC_CMDS];
2
char* argv[MAX_ARGC_CMDS];
3
argv = &argArr;
1
incompatible types when assigning to type 'char *[5]' from type 'char (*)[5]'

von ohJay (Gast)


Lesenswert?

Um die Adresse von argArr in das erste Element von argv zu schreiben 
müsste der Ausdruck so lauten:
1
char argArr[MAX_ARGC_CMDS];
2
char* argv[MAX_ARGC_CMDS];
3
argv[0] = argArr;

Ich hoffe ich habe deine Frage auch richtig verstanden...

von Max H. (hartl192)


Lesenswert?

Darf ich fragen, wozu das ganze gut sein soll?

von Kai M. (kai_mauer)


Lesenswert?

Max H. schrieb:
> Darf ich fragen, wozu das ganze gut sein soll?

Natürlich.

von Stefan F. (Gast)


Lesenswert?

Wenn du einen Zeiger auf das Array von Chars haben willst, dann schreibt 
amn das so:
1
char argArr[MAX_ARGC_CMDS];
2
char* argv;
3
argv = argArr;

von Stefan F. (Gast)


Lesenswert?

Ein Pointer auf ein Array von Pointern geht so:

char* arguments[10];
char** pointerToArguments = arguments

Ein typisches verwandtes Beispiel ist die main() Funktion unter normalen 
Betriebsystemen:

1) int main(int argc, char** argv)

ist gleichbedeutend mit

2) int main(int argc, char* argv[])


1) Kann man so lesen: argv ist ein Zeiger auf einen oder mehrere Zeiger 
auf eine Zeichenkette.

2) Kann man so lesen: argv ist ein Array mit Zeigern auf Zeichnketten.

Beides ist technisch gleichbedeutend, weil Arrays immer als Zeiger auf 
die Elemente übergeben werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.