二级指针的妙用

    如果我们想在另外的一个程序中改变某个指针的值,则必须勇二级指针实现.其实指针作为函数的参数时,只需要遵循一个原则就可以.即:一定要传递你要操作的对象的地址.

    void getMemory(char *p, int num)
    {
       *p = (char *) malloc(num);
    }
    int main(int argc, char **argv)
    {
       char *str = NULL;
       getMemory(&str, 100);
       strcpy(str, "hello!");
       puts(str);
      
       exit(0);
      }
   
    我用下面这个简单的图示来表示内存:
   

      


    因为我们想动态申请空间,并把申请的空间的地址赋值给主程序中的指针变量,主程序必须传递该指针的地址(即二级指针).之所以要如此,是由于C语言参数的传递是按值的.即形参是一个临时变量,我们不能通过改变形参的值达到改变实参的值的目的.这其实跟我们在C语言课中强调的传值还是传指针是一个道理.
   
    让我们来分析一下上面的程序.在子程序中,我们想改变的是主程序中指针的值,也就是100(假设是这样)处的内存地址中的值.那么,我们在子程序中就应该操作的是地址100.子程序中我们的指针变量p假设在内存的150处,则150处的值是主程序中的str指针的地址100.也就是p=100. 而*p = ?就是直接改变100处的值.看明白了没有!
 
    也许你会说,如果形参声明为char * p, *p不也是直接操作地址为100处的值吗?这个问题问的非常的好,刚开始我也不是很明白,总觉得是一样的道理.但是当我在调试上面的程序时才使我恍然大悟,原来如此. 哈哈!
    从数字上来说,他们的确是一样的,但是他们的类型不一样啊.
   
    char *p;   //*p的类型为字符串,当然p的值也是100
    *p = (char *) malloc(num);
    这种情况编译都不会通过,左右类型不匹配.

    char **p; //*p类型仍然是指针
    *p = (char *) malloc(num);
    左右都是指针类型,这才是正确的

    为了在子程序中实现修改指针本身的值,对形参*一次之后必须仍为指针变量.所以需要用二级指针.

    几级指针其实不是问题的关键,重点是类型匹配问题.类型将告诉编译器该类型所占据的字节数.
   
    通过上面的例子我们可以看出,只要你能将100处的四个字节(linux下指针的大小为4个字节)的值改为新分配的空间的起始地址,你想用几级指针就用几级指针.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1) 本套课程针对高校大学生系统学习C语言而录制,从0基础入门讲起,循序渐进,通俗易懂,同时适用于计算机系及非计算机系的同学。通过学习可以帮助大家掌握C语言本质,轻松面对C语言全国二级考试,并达到能独立完成型C项目、C游戏的水平;2) 多数高校都开设了C语言课程,网上C语言课程也很多,但普遍存在两个问题: (1) 授课方式单一,大多是照着代码念一遍, 对刚刚接触编程的同学来说,感觉晦涩难懂 (2) 授课内容过度注重语法,没有项目实战支撑,造成课程枯燥无趣。本课程针对上述问题进行了改进 (1) 授课方式采用语法讲解+内存布局示意图+项目的方式,让课程生动有趣好理解 (2) 系统全面的讲解了C语言的核心技术点,还配套录制了《全国计算机二级C语言真题精讲》,让学员在掌握C语言编程的同时,还能轻松面对二级考试;3) 课程详细内容: 常量-变量、分支语句、循环语句、操作符和表达式、函数(库函数、自定义函数、递归调用 )、数组(一维数 组、二维数组、数组作为函数参数、指针数组)、指针(指针和指针类型、二级指针和多级指针、指针表达式解析、指针运算、数 组指针、函数指针、回调函数)、调试技巧、程序环境和预处理(翻译环境、运行环境、预定义符号、#define和#undef、宏和函 数、条件编译、文件包含)、 数据在内存的存储、内存块分配、static、字符函数和字符串函数、自定义类型(结构体、枚举 、联合)、动态内存管理、文件操作(i/o常量、i/o函数、流)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值