Manipulate Pointers in Functions, Part IV

Those programmers I wrote about in last week’s Lesson, the ones who avoid the ** pointer notation, usually do so by using a two-dimensional array instead of the ** pointer thing. It’s a quick substitute, but it’s not exactly the same thing.

As an example, here’s the code from Part II in this series:

#include <stdio.h>

void fourchar(char **p)
{
    int x;

    for(x=0;x<4;x++)
    {
        putchar(**p);
        (*p)++;
    }
}

int main()
{
    char *text = "ABCD\n";

    fourchar(&text);
    putchar(*text);

    return(0);
}

If you just want to display four characters in a string, you could re-write the code like this:

#include <stdio.h>

void fourchar(char p[])
{
    int x;

    for(x=0;x<4;x++)
    {
        putchar(p[x]);
    }
}

int main()
{
    char text[] = "ABCD\n";

    fourchar(text);

    return(0);
}

Suppose, however, that text were a two-dimensional array. For example, it’s declared as:

char text[2][5] = { "ABCD", "WXYZ" };

You need to pass text[0], which is the string "ABCD", to the function fourchar(). Here’s the code that does that:

#include <stdio.h>

void fourchar(char p[])
{
    puts(p);
}

int main()
{
    char text[2][5] = { "ABCD", "WXYZ" };

    fourchar(text[0]);

    return(0);
}

The argument for fourchar() is in the form array[n] where n is an element number. The element number is omitted in fourchar()‘s declaration. And in the function itself, the variable name p is used, but not the square brackets. This approach has some quirks, but my guess is that most pointer-fearful programmers prefer it for sending a string to a function.

But.

Suppose the purpose of the fourchar() function is to process the two-dimensional array one element at a time? In that setup, you’d still use this statement to pass the string to the function:

fourchar(text[0]);

The variable text[0] is equivalent to the first character in the string, text[0][0]. So far, so good. The trouble lies in the fourchar() function. You cannot do this declaration:

void fourchar(char p[][]);

The compiler has no clue what a p[][] is. Most programmers would edit the declaration back to:

void fourchar(char p[]);

Within the function you could try using the p[][] variable, but again the compiler would balk. In fact, you can’t even use p[] within the function: Only variable p represents the string passed to the fourchar() function; variable p[] is unknown.

The best way to process a string character-by-character in this manner is to use the ** type of pointer, which is quite similar to what the text[][] notation represents.

I’ll show that solution in next week’s Lesson.

Leave a Reply