Um die unterschiedliche Bedeutung von Arrays und Zeigern zu verstehen, habe ich mir mal folgenden Code zusammengebastelt und im Disassembly analysiert:
ptr_array_1.c
#include <stdio.h> int main() { char carray[3] = {'a', 'b', 'c'}; int iarray[3] = {1,2,3}; char *c = "abc"; return 0; }
In der Fachliteratur wird keine Möglichkeit ausgelassen um darauf hinzuweisen, dass Arrays keine Zeiger sind. Zugegeben, ich wär in der ersten Überlegung auch nicht darauf gekommen, dass es Zeiger sein könnten. Demnach habe ich mir mal Zeiger und Arrays genauer angeschaut:
(gdb) disas main ... 0x0804839a <main+6>: mov BYTE PTR [ebp-0xb],0x61 0x0804839e <main+10>: mov BYTE PTR [ebp-0xa],0x62 0x080483a2 <main+14>: mov BYTE PTR [ebp-0x9],0x63 0x080483a6 <main+18>: mov DWORD PTR [ebp-0x18],0x1 0x080483ad <main+25>: mov DWORD PTR [ebp-0x14],0x2 0x080483b4 <main+32>: mov DWORD PTR [ebp-0x10],0x3 0x080483bb <main+39>: mov DWORD PTR [ebp-0x8],0x8048490 ...
Interessant sind hierbei die Zeilen <main+6>, <main+10>, <main+14> und die Zeile <main+39>. In den ersten drei Zeilen wird das »carray« initialisiert. Man erkennt, dass das Array in lauter Zeiger zerfällt, welche auf jeweils ein Element des Arrays zeigen. Dagegen wird in der Zeile, wo der char-Zeiger »c« initialisiert wird, nur die Adresse 0x8048490 übergeben, in der der Inhalt steht:
(gdb) x/s 0x8048490
0x8048490: "abc"
— pronto 2011/12/11 15:04