In Part II of this series, I showed code that let you pass a pointer’s address to a function. Within that function, the address can be manipulated and value at that address displayed. Can the same thing be done with a two-dimensional array, which is loosely related to a ** pointer?
As a reference, here is the fourchar() function I used in Part II’s sample code:
void fourchar(char **p)
{
int x;
for(x=0;x<4;x++)
{
putchar(**p);
(*p)++;
}
}
For a second, forget pointers and pointers-to-pointers. Consider instead an array.
A single dimension array is like a pointer’s cousin. Lots of C programmers rely on the similarity to avoid using pointers. In a way, a two-dimensional array is like a pointer-pointer. The problem with this similarity is that it doesn’t really translate well.
For example, assume that you have a two-dimensional array, one that stores two strings:
char text[2][5] = { "ABCD", "WXYZ" };
You want to send strings from this array to the fourchar() function. So you write the following function:
void fourchar(char p[][])
{
int x;
for(x=0;x<4;x++)
{
putchar(p[][x]);
}
}
This code won’t compile. The compiler has no idea what the argument p[][] is. Yet, your code needs to manipulate a char array in the manner shown above. The function can take p[] as an argument, but within the function, how can you access individual array elements? One solution is to use a pointer-pointer instead.
The following code is similar to last week’s Lesson code, but uses pointers instead of array notation.
#include <stdio.h>
void fourchar(char **p)
{
int x;
char c;
for(x=0;x<4;x++)
{
c = *(*p+x);
putchar(c);
}
}
int main()
{
char *text[] = { "ABCD", "WXYZ" };
fourchar(&text[0]);
return(0);
}
In the main() function, *text[] is an array. You could declare it as a two-dimensional array, but then you lock yourself out of the option of sending a text[][] item to a function. So you must declare an array of char pointers to make the function call work. (You could also declare the variable as **text, but that would involve using malloc() and assigning strings and other nonsense.)
At Line 19, the fourchar() function is called with the address of the first string in the *text[] array.
In the fourchar() function, variable **p represents the address of a pointer, which is the address of the string. A for loop marches through each character in the string. Variable c holds the character fetched. It’s not a required variable, but it does eliminate a layer of parentheses that would otherwise cluster inside the putchar() function. Here’s how Line 10 unwinds:
c = *(*p+x);
At the core, *p represents an address, the address of string "ABCD". Variable x is an offset from that address. You must format it as *p+x, which evaluates as an address. To fetch the character at that address, you enclose *p+x in parentheses and use the asterisk: *(*p+x).
In the end, the code marches through each character in the array, just as if the p[][] format were used.
If you like, you can add a second statement to the main() function:
fourchar(&text[1]);
This statement processes the second string in the *text[] array.