zeiger auf zeiger

Gast #4204678
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?
#4204723
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).
Gast #4204915
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
}
Gast #4205599
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]'
Gast #4205652
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...
Gast #4206204
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren