c指针作为参数传递以及指针的指针
指针作为函数参数传递
函数参数传递的只能是数值,所以当指针作为函数参数传递时,传递的是指针的值,而不是地址。
#include "stdio.h"
void pointer(int *p)
{
int a = 11;
printf("\n\nEnter function");
printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p);
*p =11;
printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p);
p = &a;
printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p); printf("\nfunction return\n");
} int main()
{
int b =22;
int *p = &b; printf("the b address %X\n",&b);
printf("the p is point to %p , addr is %X, *p is %d",p , &p, *p);
pointer(p);
printf("\nthe p is point to %p , addr is %X, *p is %d\n",p , &p, *p);
}
输出结果:
the b address 28FF3C
the p is point to 0028FF3C , addr is 28FF38, *p is 22 Enter function
the p is point to 0028FF3C , addr is 28FF20, *p is 22
the p is point to 0028FF3C , addr is 28FF20, *p is 11
the p is point to 0028FF0C , addr is 28FF20, *p is 11
function return the p is point to 0028FF3C , addr is 28FF38, *p is 11
- %p为指针所指向的数据的地址,这里既为变量b的地址。
- 在没有进入pointer函数之前,变量p存储的值为28FF3C,变量p的地址为28FF38,*p的值等于b的值等于22
- 进入pointer之后,p所指向的内存地址没有改变,但是p自身的地址变了。意味着函数传递只是将28FF3C传递进来了。虽然这个指针变量名字还是叫做p,但与main函数中的指针变量已经不一样了。这意味着,你可以改变main函数中b的值,但是不能改变p的值
函数参数为指针的指针
先看一个例子
#include "stdio.h" void GetMemory(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);
} void main()
{
char *str=NULL;
GetMemory(str,100);
strcpy(str,"hello");
printf(str);
}
GetMemory这个函数是调用malloc申请一块内存。乍一看好像没什么问题,编译也不会报错。但是运行起来,程序直接奔溃。 其实有了上面的分析就可以知道,GetMemeory中的p是不能改变str的指向的,也就是说str还是指向NULL。GetMemory中的P是临时申请的一个指针变量,当str传值进来(NULL),时,p指向NULL,除此之外,没做任何改变。当运行malloc函数后,也只是将malloc返回的的指针地址赋给了p,并不能传递给str。所以这里就需要指针的指针了
#include "stdio.h" void GetMemory(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num);
} void main()
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello\n");
printf(str);
}
这个时候就是将指针变量str的地址传递了过去,而不是将指针变量的值(NULL)传递了过去,因此就可以改变str的指向了。
c指针作为参数传递以及指针的指针的更多相关文章
- 漫谈C指针:参数传递的三道题目
漫谈C指针:参数传递的三道题目 2009-07-02 开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下: [c] view plaincopy ...
- (C++)函数参数传递中的一级指针和二级指针
主要内容: 1.一级指针和二级指针 2.函数指针传递的例子 3.什么时候需要传递二级指针? 4.二级指针在链表中的使用 1.一级指针和二级指针 一级指针:即我们一般说的指针,就是内存地址: 二级指针: ...
- 《挑战30天C++入门极限》在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。
在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子. 以下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址. #include <std ...
- C和C指针小记(十七)-使用结构和指针-链表
1.链表 链表(linked list)即使是一些包含数据的独立数据结构的(Node)集合. 链表中的每个节点通过链或指针链接在一起. 程序通过指针访问链表中的节点. 节点通常是动态分配的,但也有由节 ...
- C语言指针使用小记 (深入理解C指针 读后小记)
最近正值过年在家,新年初一,闲暇时间无事可做便把以前看过的书籍整理了一下,顺手也把这本“深入理解C指针”的书重新读了一遍,这本书总体感觉比较简单,但是还是不免有些地方是平时没有想到过或者没有注意到的, ...
- c++值传递,指针传递,引用传递以及指针与引用的区别
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- Java中到底有没有指针;同时注意引用和指针的区别
Java中引用的作用类似于指针,但是有区别:() (1) 指针必然指向一个内存地址,如果你定义的时候不指定,就会乱指(很可能造成安全隐患)但是引用定义出来后默认指向为空. (2) 指针可 ...
- [转] C++指针加整数、两个指针相减的问题
http://blog.csdn.net/onlyou930/article/details/6725051 说来惭愧,写C++有一段时间了.这个问题从来没有认真考虑过,此次标记于此: 考虑如下问题: ...
- c++中多态性、dynamic_cast、父类指针、父类对象、子类指针、子类对象
c++多态性是依靠虚函数和父类指针指向子类对象来实现的.简单来说,父类中定义虚函数,父类指针指向子类对象,父类指针调用函数时调用的就是子类的函数. 父类没有定义虚函数,父类指针指向子类对象时,父类指针 ...
随机推荐
- .Net IOC框架入门之二 CastleWindsor
一.简介 Castle是.net平台上的一个开源项目,为企业级开发和WEB应用程序开发提供完整的服务,用于提供IOC的解决方案.IOC被称为控制反转或者依赖注入(Dependency Injectio ...
- Micropython教程之TPYBoardv102 DIY蓝牙智能小车实例
1.实验目的 1.学习在PC机系统中扩展简单I/O接口的方法. 2.进一步学习编制数据输出程序的设计方法. 3.学习蓝牙模块的接线方法及其工作原理. 4.学习L298N电机驱动板模块的接线方法. 5. ...
- Linux中创建新用户并赋给指定文件权限
工作中用到了,写篇日志总结一下. 创建新的用户: 第一种方式: 创建用户: adduser name 创建密码: passwd name(回车后出现修改密码的提示) 该方式创建的用户目录默认在home ...
- TypeScript体验
TypeScript 在线玩 http://www.typescriptlang.org/play/index.html ts最终编译成js 网站最终还是要引用js. ts面向对象的感念更加直观, ...
- 编写OC高质量的代码的有效方法
1. 写这个只是为了自己记忆,有相关pdf文件,如需要留下邮箱.. 2. 在类的头文件中尽量少引入其他头文件 除非确有必要,否则不要引入头文件.一般来说,应在某个类的头文件中使用向前声明来提及别的类( ...
- ReSharper 全教程
Resharper系列 更多关于Resharper的介绍 参考我之前的文章: Resharper 详细教程 提升ReSharper和Visual Studio的性能 Visual Studio中使用R ...
- 微信小程序——Now you can provide attr "wx:key" for a "wx:for" to improve performance.
在官方的swiper(滑块视图容器)中demo代码,运行时会出现Now you can provide attr "wx:key" for a "wx:for" ...
- Docker快速指南
Docker使用Go语言开发,基于Linux内核的cgroup.namespace以及AUFS等技术对进程进行封装隔离,是一种操作系统层面的虚拟化技术.由于隔离的进程独立于宿主和其它的隔离的进程,因此 ...
- Smart-image通过SoftReference提高性能
文章导读: 文件介绍了常见的图片下载开源插件smart-image, 由于移动设备硬件受限,因此Android的相关app都要考虑到性能的关系, 所以很多的第三方插件都使用到了缓存cache技术,本人 ...
- JSON 数据操作
2018,狗年.如果在你出生日期的年份上加12等于2018的话,私聊我,今年是你的本命年,你得发红包!!! 子(鼠).丑(牛).寅(虎).卯(兔).辰(龙).巳(蛇).午(马).未(羊).申(猴).酉 ...