*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[]=?
思考:为什么结果和上面程序不一样。其实注释里已经给出了答案,哈哈。

**p,*p和&p使用有感的更多相关文章

  1. 从小工到专家 ——读《Java程序员职场全攻略》有感

    从小工到专家 ——读<Java程序员职场全攻略>有感   <Java程序员职场全攻略>是以故事的形式,向读者介绍Java程序员的职场经验.作者牛开复在北京从事软件开发,已经是一 ...

  2. 漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有感

    前篇回顾:上篇<漫谈可视化Prefuse(二)---一分钟学会Prefuse>主要通过一个Prefuse的具体实例了解了构建一个Prefuse application的具体步骤.一个Pre ...

  3. 见证历史 -- 2013 NBA 热火夺冠之路有感

    见证历史-- 2013 NBA 热火夺冠之路有感今年NBA季后赛从第一轮看起,到最终的热火夺冠,应该看得是最爽的一次.但一些情节和细节,回忆起来,深有感悟. 1. 做人要低调詹宁斯豪言演黑八雄鹿本赛季 ...

  4. <构建之法>第十三章到十七章有感以及这个项目读后感

    <构建之法>第十三章到十七章有感 第13章:软件测试方法有哪些? 主要讲了软件测试方法:要说有什么问题就是哪种效率最高? 第14章:质量保障 软件的质量指标是什么?怎么样能够提升软件的质量 ...

  5. 段描述符表(GDT+LDT)的有感

    [0]写在前面 要知道,在汇编中,代码的装入顺序决定了在内存中的地址位置.所有的代码或者数据都在硬盘上,当调试或者启动的时候,加载到内存:当需要对数据进行处理的时候,我们通过将数据从内存载入到regi ...

  6. 驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)

    中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中 ...

  7. 第一次QQ群视频教育有感

    标题:第一次QQ群视频教育有感 作者:丁又专, 时间:2014.08.16     教育的目的:启示学生心智,发现个人优势,激发探索欲望.     今天早上看到 中国大学MOOC<文献管理与信息 ...

  8. 10.读google测试之道有感

    (一)读google测试之道有感.  

  9. 重读COM技术内幕(inside com)有感

    重读COM技术内幕(inside com)有感 面向对象设计哲学在复杂领域并不能很好地解决问题.参考(http://www.richardlord.net/blog/what-is-an-entity ...

  10. [minecraft]mcCoder制作有感

    mcCoder是一个minecraft-forge-mod制作库,力图让mod制作者可以更简单的制作mod,减少mod制作者的mod制作难度. 在GitHub上关注这个项目: 原理 mcCoder主要 ...

随机推荐

  1. Code Review最佳实践

    我一直认为Code Review(代码审查)是软件开发中的最佳实践之一,可以有效提高整体代码质量,及时发现代码中可能存在的问题.包括像Google.微软这些公司,Code Review都是基本要求,代 ...

  2. C# 一句很简单而又很经典的代码

    一.知识点 二.问题 如果以上四个问题,你很自信,那么以下,您就不要看了,因为我想说的东西真的很简单. 如果你开始怀疑自己,可以继续向下看.你自己到底真的理解吗??? 再看下面这段代码有没有问题? c ...

  3. 《VR入门系列教程》之12---转换矩阵

    转换矩阵     模型网格的三维空间位置都是由它们的顶点坐标决定的,如果每次想要移动一下模型位置都要依次改变每个网格的顶点坐标,这将一件非常头疼的事,要是遇上需要显示动画效果那就更糟了.为了解决这个问 ...

  4. [POJ2559&POJ3494] Largest Rectangle in a Histogram&Largest Submatrix of All 1’s 「单调栈」

    Largest Rectangle in a Histogram http://poj.org/problem?id=2559 题意:给出若干宽度相同的矩形的高度(条形统计图),求最大子矩形面积 解题 ...

  5. C#七种设计原则

    在C#中有七种设计原则 分别是 1.开闭原则(Open-Closed Principle, OCP) 2.单一职责原则(Single Responsibility Principle) 3.里氏替换原 ...

  6. Mac相关快捷键操作

    拷贝: shift + option + 拖动拖动至目的地 创建快捷方式: option + command + 拖动至目的地

  7. CountDownLatch实现多线程并发请求

    package com.test; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Dat ...

  8. sed流编辑器

    一.前言 (一).sed 工作流程 sed 是一种在线的.非交互式的流编辑器,它一次处理一行内容.处理时,把当做前处理的行存储在临时缓存区中,成为“模式空间”(pattern space),接着用se ...

  9. 佳木斯集训Day8

    本来能AK的啊啊啊啊啊,唯一一天可以AK,却被Champion误导了(好吧实际上是我理解有问题) T1我写了俩小时,就是一道数列题,推公式的,可以二分解,我觉得二分麻烦,就直接想O(1)了 #incl ...

  10. Cannot attach the file “MvcMovie.mdf” as database “aspnet-MvcMovie”

    今天在微软开发人员官网上学习asp.net mvc5入门的时候,遇到一个棘手的问题,我是按照教程一步一步操作的,但期间遇到一个自己觉得莫名其妙的问题,教程中也没有提到这个, 在添加新字段这一章节,跟着 ...