Why this shows warning:
#include<stdio.h>
foo (const char **p)
{
}
int main(int argc , char **argv)
{
foo(argv);
}
But following does not show any warning
char * cp;
const char *ccp;
ccp = cp;
The first code snippet shows warning passing arg 1 of foo
from incompatible pointer type. But the second snippet does not show any warning. Both are const
pointers
See the C FAQ list
You can cast in order to remove warnings:
foo((const char **)argv);
But as FAQ says: the need for such a cast may indicate a deeper problem which the cast doesn't really fix.
Depending on your compilation flags, you might need an explicit cast when assigning cp's content to ccp.
In the first version you are casting between two different types of pointer not simply adding a const
to the pointer.
char **
is a pointer to a (pointer to a char
)
const char **
is a pointer to a (pointer to a const char
)
As you can see these pointer point to different types similar to the more obviously questionable:
int *i;
double *d;
d = i;
In your second example you see that you can cast from a pointer to a const pointer so if you were to apply this to your situation you would need to have a const pointer to (a pointer to a char
).
foo(char * const *p);