*p两种使用情况:
1.定义指针变量,如char *p;这里p是一个变量,单单在这一点上与int a 无差别;但p这个变量特殊在其中只能存地址。
引申:对于char **p,p中存一个地址add1,add1对应存储区存放add2,而add2地址对应存储区才存放有真正的data;如下图1所示:
2.*p,用来取p中所存地址对应存储区的数据,如上图2所示。
例如:主函数main中有char *p,p=。。。令p中存放某一内存首地址。这时调用子函数,若想在子函数fun中修改p指向的内存,必须要得到p的地址即fun(&p),然后用*p=。。。才能需改p指向的内存,具体如下图所示:
void func(char **p2)
{
char *p1 ;
p1 = (char *)malloc(sizeof(char) * 8);
p1 = "hello";
*p2 = p1;
}
int main(){
char *p = NULL;
func(&p);
printf("p=%s\n",p);//打印p指向内存所存字符串。
getchar();
return 0;
}
输出:hello
一个典型错误:
看你能不能找出来:
1 void t(char **p2){
2 char *p1 ;
3 p1 = (char *)malloc(1);
4 *p2 = p1;
5 }
6 int main(){
7 char **p ;
8
9 t(p);
10 return 0;
11 }
为什么一运行就提示p没有初始化。
再看一个**p的例子:
void t(char **p2) { char *p1 ; //p1 = (char *)malloc(1); p1 = "hello"; *p2 = p1; } int main(){ char **p; p = (char **)malloc(sizeof(char) * 8); char arr[] = "zhang"; *p = arr; printf("a[0]=%c\n",arr[0]); t(p); printf("*p=%s,p=%d\n",*p,p); printf("a[0]=%c\n",arr[0]); return 0; }
输出:
a[0]=z
*p=hello,p=13531344
a[0]=z
这种方式原本的arr[]数据还在,只是*p不指向了,*p指向了“hello”所在内存的地址。
再看一种:
void t(char **p2)
{
char *p1 ;
p1 = "hello";
*p2 = p1;
}
int main(){
char **p;
//p = (char **)malloc(sizeof(char) * 8);
char arr[] = "zhang";
p = (char **)arr;//*p = arr思考注释中的这种方式的差别?
printf("a[0]=%c\n",arr[0]);
t(p);
printf("p=%s,p=%x\n",*p,p);
printf("a[0]=%c\n",arr[0]);
return 0;
}
输出:原来数组被冲刷掉
a[0]=z
p=hello,p=75fe70
a[0]=?