指针作为函数参数传递

函数参数传递的只能是数值,所以当指针作为函数参数传递时,传递的是指针的值,而不是地址。

#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
  1. %p为指针所指向的数据的地址,这里既为变量b的地址。
  2. 在没有进入pointer函数之前,变量p存储的值为28FF3C,变量p的地址为28FF38,*p的值等于b的值等于22
  3. 进入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指针作为参数传递以及指针的指针的更多相关文章

  1. 漫谈C指针:参数传递的三道题目

    漫谈C指针:参数传递的三道题目 2009-07-02 开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下: [c] view plaincopy ...

  2. (C++)函数参数传递中的一级指针和二级指针

    主要内容: 1.一级指针和二级指针 2.函数指针传递的例子 3.什么时候需要传递二级指针? 4.二级指针在链表中的使用 1.一级指针和二级指针 一级指针:即我们一般说的指针,就是内存地址: 二级指针: ...

  3. 《挑战30天C++入门极限》在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。

        在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子. 以下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址. #include <std ...

  4. C和C指针小记(十七)-使用结构和指针-链表

    1.链表 链表(linked list)即使是一些包含数据的独立数据结构的(Node)集合. 链表中的每个节点通过链或指针链接在一起. 程序通过指针访问链表中的节点. 节点通常是动态分配的,但也有由节 ...

  5. C语言指针使用小记 (深入理解C指针 读后小记)

    最近正值过年在家,新年初一,闲暇时间无事可做便把以前看过的书籍整理了一下,顺手也把这本“深入理解C指针”的书重新读了一遍,这本书总体感觉比较简单,但是还是不免有些地方是平时没有想到过或者没有注意到的, ...

  6. c++值传递,指针传递,引用传递以及指针与引用的区别

    值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...

  7. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  8. Java中到底有没有指针;同时注意引用和指针的区别

    Java中引用的作用类似于指针,但是有区别:()    (1) 指针必然指向一个内存地址,如果你定义的时候不指定,就会乱指(很可能造成安全隐患)但是引用定义出来后默认指向为空.     (2) 指针可 ...

  9. [转] C++指针加整数、两个指针相减的问题

    http://blog.csdn.net/onlyou930/article/details/6725051 说来惭愧,写C++有一段时间了.这个问题从来没有认真考虑过,此次标记于此: 考虑如下问题: ...

  10. c++中多态性、dynamic_cast、父类指针、父类对象、子类指针、子类对象

    c++多态性是依靠虚函数和父类指针指向子类对象来实现的.简单来说,父类中定义虚函数,父类指针指向子类对象,父类指针调用函数时调用的就是子类的函数. 父类没有定义虚函数,父类指针指向子类对象时,父类指针 ...

随机推荐

  1. Java笔记:语法基础

    Java语法基础 更新时间:2018-1-7 10:34:05 Hello World 文件名:HelloWorld.java public class HelloWorld { public sta ...

  2. sql优化原则与技巧

    加快sql查询是非常重要的技巧,简单来说加快sql查询的方式有以下几种:一.索引的引用 1.索引一般可以加速数据的检索速度,加速表与表之间的链接,提高性能,所以在对海量数据进行处理时,考虑到信息量比较 ...

  3. Robot Framework学习笔记(三)------常用关键字介绍

    下面关键字全部由 Builtin 库提供,Builtin 为 Robot Framework 标准类库.Builtin库提供常用的关键字 1.log log 关键字就是编程语言里的"prin ...

  4. 转:java 可设置最大内存

    测试方法:在命令行下用 java -XmxXXXXM -version ,比如:java -Xmx1024M -version命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大 ...

  5. C#winform自定义控件模拟设计时界面鼠标移动和调节大小、选中效果

    要想玩转Winform自定义控件需要对GDI+非常熟悉,对常用的控件有一些了解,好选择合适的基类控件来简化. 要点说明及代码 1)定义接口: using System; using System.Wi ...

  6. python之dictionary

    1.python3字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 d ...

  7. java字符串比较

    我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是"==",但在java中不能这么写.在j ...

  8. vue-router 组件复用问题

    组件系统是Vue的一个重要组成部分,它可以将一个复杂的页面抽象分解成许多小型.独立.可复用的组件,通过组合组件来组成应用程序,结合vue-router的路由功能将各个组件映射到相应的路由上,通过路由的 ...

  9. CSS中伪类选择器及伪元素

    1.伪类选择器 在CSS中,最常用的伪类选择器是使用在a(锚)元素上的几种选择器,它们的使用方法如下: a:link{color:#FF0000;text-decoration:none} a:vis ...

  10. BZOJ:4031: [HEOI2015]小Z的房间

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1103  Solved: 536[Submit][Status][Discuss] Descripti ...