在C中,把一个指针q赋给另一个指针p(p = q)时要保证:
- p和q指向相容的类型
- p和q所指的类型可以带限定符(const...)或不带
- p所指的类型必须有q所指类型的所有限定符
Example
- (char *) can assign to (const char *)
- (char **) can assign to (char * const *) but can't assing to (const char **)
Example Source Code
const.c/**
* File Name: const.c
* Date: 2008-3-27
* Intention: Understanding the type-qualifier const
* Run Environment: gcc-4.1.2 on Linux 2.6.23.1
* Compile Command: gcc const.c -o const.o
* Usage: ./const.o
*/
#include <stdio.h>
#include <stdlib.h>
void testConstF0();
void testConstF1(const char *p);
void testConstF2(const char **p);
void testConstF3(char * const *p);
int main(int argc, char *argv[]){
printf("/nWhile assigning between pointer:/n");
testConstF0();
testConstF1(*argv); /*(char *) assigns to (const char *)*/
/*
While compiling,
call testConstF2(const char **p) by testConstF2(argv) will get a warning: passing argument 1 of ‘testConstF2’ from incompatible pointer type
*/
/*testConstF2(argv);*/ /*(char **) assigns to (const char **)*/
testConstF3(argv); /*(char **) assigns to (char * const *)*/
exit(0);
}
void testConstF0(){
const int i = 1; /*i can only be assigned value at here*/
/*int *p = &i;*/ /*get a warning: initializatioin discards qualifier from pointer to target type */
const int *p = &i;
int j = 2;
p = &j;
}
void testConstF1(const char *p){
printf("/n(char *) can assign to (const char *)/n");
}
void testConstF2(const char **p){
printf("/n(char **) can't assign to (const char **)/n");
}
void testConstF3(char * const *p){
printf("/n(char **) can assign to (char * const *)/n");
}
Result
While assigning between pointer:
(char *) can assign to (const char *)
(char **) can assign to (char * const *)