Arrays:
|
Ordinary C arrays | Dynamic C arrays |
---|---|
#include <stdio.h> #define SIZE 4 void init(int a[], int size); void print(int a[], int size); int main() { int a[SIZE]; init(a, SIZE); print(a, SIZE); } void init(int a[], int size) { int i; for (i = 0; i < size; i++) a[i] = i*i + 1; } void print(int a[], int size) { int i; for (i = 0; i < size; i++) { printf("a[%i]=%i", i, a[i]); printf( i < size-1 ? ", " : "\n"); } } | #include <stdio.h> #include <stdlib.h> /* for malloc & free */ #define SIZE 4 void init(int *p, int size); void print(int *p, int size); int main() { int *p = (int *)malloc(sizeof(int) * SIZE); init(p, SIZE); print(p, SIZE); free(p); } void init(int *p, int size) { int i; for (i = 0; i < size; i++) *(p+i) = i*i + 1; } void print(int *p, int size) { int i; for (i = 0; i < size; i++) { printf("*(p+%i)=%i", i, *(p+i)); printf( i < size-1 ? ", " : "\n"); } } |
Output | Output |
a[0]=1, a[1]=2, a[2]=5, a[3]=10 | *(p+0)=1, *(p+1)=2, *(p+2)=5, *(p+3)=10 |
The two notations, index and pointer, are mostly interchangable, even in the same program. To illustrate this, I took the two programs above and interchanged the function definitions. Notice that I kept the prototypes the same, so they don't seem to match the function definition any more. Everything works perfectly, and even lint is happy with this code.
Functions Interchanged, Prototypes Not | |
---|---|
#include <stdio.h> #define SIZE 4 void init(int a[], int size); void print(int a[], int size); int main() { int a[SIZE]; init(a, SIZE); print(a, SIZE); } void init(int *p, int size) { int i; for (i = 0; i < size; i++) *(p+i) = i*i + 1; } void print(int *p, int size) { int i; for (i = 0; i < size; i++) { printf("*(p+%i)=%i", i, *(p+i)); printf( i < size-1 ? ", " : "\n"); } } | #include <stdio.h> #include <stdlib.h> /* for malloc & free */ #define SIZE 4 void init(int *p, int size); void print(int *p, int size); int main() { int *p = (int *)malloc(sizeof(int) * SIZE); init(p, SIZE); print(p, SIZE); free(p); } void init(int a[], int size) { int i; for (i = 0; i < size; i++) a[i] = i*i + 1; } void print(int a[], int size) { int i; for (i = 0; i < size; i++) { printf("a[%i]=%i", i, a[i]); printf( i < size-1 ? ", " : "\n"); } } |
Output | Output |
*(p+0)=1, *(p+1)=2, *(p+2)=5, *(p+3)=10 | a[0]=1, a[1]=2, a[2]=5, a[3]=10 |