**p,*p和&p使用有感

*p两种使用情况:

1.定义指针变量,如char *p;这里p是一个变量,单单在这一点上与int a 无差别;但p这个变量特殊在其中只能存地址

引申:对于char **p,p中存一个地址add1,add1对应存储区存放add2,而add2地址对应存储区才存放有真正的data;如下图1所示:

**p,*p和&p使用有感

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=%sn",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]=%cn",arr[0]);         t(p);      printf("*p=%s,p=%dn",*p,p);  	printf("a[0]=%cn",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]=%cn",arr[0]);      t(p);      printf("p=%s,p=%xn",*p,p);      printf("a[0]=%cn",arr[0]);      return 0;  }
输出:原来数组被冲刷掉

a[0]=z
p=hello,p=75fe70
a[0]=?

 

未经允许不得转载:杂烩网 » **p,*p和&p使用有感

评论 0

#快捷签到点我#

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

置顶文章