Programming‎ > ‎C‎ > ‎

Array

1. char array[] = "abc" sets the first four elements in array to 'a', 'b', 'c' and '\0'.
    char *ptr = "abc" sets pointer to the address of the "abc" string, which may be stored in read only memory and thus   unchangeable.

2. The C standard C99 allows variable length arrays.
    int func(int n)
    {
      float vals[n];
    }

3. C treats array parameters as pointers.
    void foo(int arr_param[]) { arr_param = NULL;}
    void foo(int *arr_param)  { arr_param = NULL;}
    Array parameters treated as pointers because of efficiency. It is inefficient to copy the array data in terms of both memory and time.

4. Is the expression 5["abcdef"] legal?
    Array subscripting is commutative in C.
    a[e], *((a) + (e)), *((e) + (a)), e[a] are same.
    char *tmpptr = "abcdef";
    tmpptr[5], 5["abcdef"], "abcdef"[5] are same.

5. How do I declare a pointer to an array.
    int a1[3] = {0,1,2};
    int a2[2][3] = {{3,4,5}, {6,7,8}};
    int *ip;         //pointer to int
    int (*ap) [3]  //pointer to array [3] of int

    ip = a1;
    printf("%d", *ip); //0

    ap = &a1;
    printf("%d", **ap); //0
    ap++;  //Wrong
    
    ap = a2;
    printf("%d %d", (*ap)[0], (*ap)[1]); //3 4
    ap++;
    printf("%d %d", (*ap)[0], (*ap)[1]); //6 7

6. How can I determine how many elements are in an array, when sizeof yields the size in bytes.
    Simply divide the size of entire array by the size of one element.
    int array[] = {1,2,3};
    int narray = sizeof(array) / sizeof(array[0]);

7. Compiler complained on passing two-dimensional array to a function expecting a pointer to a pointer.
    An array of arrays decays into a pointer to an array, not a pointer to a pointer.
    int array[NROWS][NCOLUMNS];
    f(array);
    f(int a[][NCOLUMNS]);
    f(int (*ap)[NCOLUMNS]);

8. How can I dynamically allocate a multidimensional array?
    Method 1: Max call to malloc
    int **array1 = (int **)malloc(nrows * sizeof(int *));
    for(i = 0; i < nrows; i++)
      array1[i] = (int *)malloc(ncolumns * sizeof(int));

    Method 2: Two call to malloc
    int **array2 = (int **)malloc(nrows * sizeof(int *));
    array2[0] = (int *)malloc(nrows * ncolumns * sizeof(int));
    for(i = 1; i < nrows; i++)
      array2[i] = array2[0] + i * ncloumns;

    Method 3: One call to malloc
    int **array3 = (int **)malloc(nrows * sizeof(int *) + nrows * ncolumns * sizeof(int));
    for(i = 0; i < nrows; i++)
      array3[i] = array3[nrows] + i * ncolumns;
Comments