*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指向的内存,必须:

(1)要得到p的地址即fun(&p),然后用*p=。。。才能需改p指向的内存,具体如下:

void func(char **p2)
{
char *p1 ;
//p1 = (char *)malloc(sizeof(char) * );
p1 = "hello";
*p2 = p1;
}
int main(){
char *p = NULL; func(&p);
printf("p=%s\n",p);//打印p指向内存所存字符串。
getchar(); return ;
}
输出:hello

(2)若不想传地址,就需要子函数带返回值,程序如下:

char * func(void)
{
  char *p1 ;
  p1 = "hello";
  return p1;
}
int main(){ char *p = NULL; p=func();
printf("p=%s\n",p);//打印p指向内存所存字符串。
getchar(); return ;
}
输出:hello

引申:下面给出一些案例

一个典型错误:

看你能不能找出来:

  void t(char **p2){
char *p1 ;
p1 = (char *)malloc();
*p2 = p1;
}
int main(){
char **p ; t(p);
return ;
} 为什么一运行就提示p没有初始化。

改进:下面为对**p正确应用的例子:

void t(char **p2)
{
char *p1 ;
//p1 = (char *)malloc(1);
p1 = "hello";
*p2 = p1;//*p本来指向arr[],现在指向"hello"所在内存区域首地址,所以堆arr[]没影响。
}
int main(){
char **p;
p = (char **)malloc(sizeof(char) * );
char arr[] = "zhang";
*p = arr;//*p中存放arr地址,区别于p = (char **)arr直接p中存放arr地址
printf("a[0]=%c\n",arr[]); 
t(p);
printf("*p=%s,p=%d\n",*p,p);
printf("a[0]=%c\n",arr[]);
return ;

输出:

a[0]=z
*p=hello,p=13531344//不同人结果不一样。
a[0]=z

这种方式原本的arr[]数据还在,只是*p不指向了,*p指向了“hello”所在内存的地址。

再看一种:注意与上面程序对比,你就能明白**p到底这么用。

void t(char **p2)
{
char *p1 ;
p1 = "hello";
*p2 = p1;//p存放arr地址,*p 对应arr[0]的值,因此这句会破坏原理的arr数组。
}
int main(){
char **p;
//p = (char **)malloc(sizeof(char) * 8);
char arr[] = "zhang";
p = (char **)arr;//*p = arr思考注释中的这种方式的差别?//p存放arr地址
printf("a[0]=%c\n",arr[]);
t(p);
printf("p=%s,p=%x\n",*p,p);
printf("a[0]=%c\n",arr[]);
return ;
}
输出:
a[]=z
p=hello,p=75fe70
a[]=?
思考:为什么结果和上面程序不一样。其实注释里已经给出了答案,哈哈。

最新文章

  1. Android之简单了解Bitmap显示图片及缓存图片
  2. android webview里获取和设置cookie
  3. Secrets
  4. 用hashMAP或ArrayList解决recylerView中checkbox的选择错乱问题。
  5. JS事件委托学习(转)
  6. Android Context 是什么?
  7. list集合的遍历3种方法
  8. turing 项目引用
  9. Android Fragment 基本介绍[转]
  10. 克隆虚拟机,如何将克隆虚拟的网卡设置为eth0
  11. MAC OS X 快捷键(自己总结)
  12. 链表-Reverse Linked List
  13. 一个简单的Servlet工具
  14. php命令执行脚本
  15. CSDN博客测试目录
  16. freemarker之数组(十八)
  17. 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
  18. 译注(3): NULL-计算机科学上最糟糕的失误
  19. Android短信备份及插入笔记
  20. ecs

热门文章

  1. java高并发系列 - 第14天:JUC中的LockSupport工具类,必备技能
  2. K-Means(K均值)、GMM(高斯混合模型),通俗易懂,先收藏了!
  3. phpcms V9 常用的调用标签
  4. python课堂整理12---递归
  5. On The Way—Step 2 Python入门之Python内容初始
  6. Linux命令之文件相关
  7. Mysql优化(出自官方文档) - 第五篇
  8. js实现3D切换效果
  9. python 简单的实现文件内容去重
  10. 解决:django.db.utils.OperationalError: unable to open database file