指针用作传出参数时,需要二级指针

1. 参数传递的原则是:形参传给实参,不能反向传递;

2. 一级指针可以在函数内部修改形参指针指向的内容;

如:

void fun(char *p)
{
    p[2] = a;//由形参(实参)指向的函数外部的数组的内容就被改变了。
} 

如果我们想改变实参本身呢?也就是说,我们连指针值都要改变,如果使用:

void GetMemory(int num, char *p)
{
    p = (char *)malloc(num * sizeof(char))
    //或C++中:p = new char[10];
} 

就不行了,因为在函数内部不能通过改变形参的值来改变实参

但是,可以通过二级指针来改变指针值。

void GetMemory(char **p, int num)
{
    *p = new char[num];
    *p[2] = a;
    delete char[];
} 

关键是:

1. 编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。

在本例中,_p申请了新的内存,只是把 _p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。
如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,
2. 变量作函数形参调用的时候都是要分配一个副本,不管是传值还是传址。传入后就和形参没有关系了,它不会改变形参的值。

注意指针所指向的内存是在函数内分配的还是在函数外分配的,以及是不是在堆上分配的。

你定义了一个指针,但是并没有分配指针指向对象所需的内存空间;当函数返回后,此函数栈中的内存会被释放掉,不要让指针指向此函数栈中的内存空间,要指向堆上或此函数外的内存空间。

时间: 2024-10-21 14:38:53

指针用作传出参数时,需要二级指针的相关文章

Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案

先看下面一个例子 #import <UIKit/UIKit.h> #import "AppDelegate.h" @interface Something : NSObject - (void)doWithError:(NSError **)outError; @end @implementation Something - (void)doWithError:(NSError **)outError { @autoreleasepool { *outError = [NS

实参和形参指针做函数参数时,如何改变main函数变量的值

//对输入的两个整数按大小顺序输出 代码如下: #include<iostream> using namespace std; int main() { void swap(int *p1,int *p2); int *pointer_1,*pointer_2,a,b; cin>>a>>b; pointer_1=&a; pointer_2=&b; if(a<b)swap(pointer_1,pointer_2); cout<<"

二维数组和二级指针作为参数传给参数的方式

  一.如果要将二维数组传给一个函数,有几种传参方式?     1).直接将二维数组传给函数.     eg:         void test(int arr[3][4]); 2).以数组指针的方式传入.     eg:         void test(int (*arr)[4]); 第一种方式很容易理解.第二方式我们来分析分析.首先将二维数组看作是一个一维数组,有三个元素,arr[0],arr[1],arr[2].每个元素中有四个元素.例如,(arr[0])[0],(arr[0])[1

C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)

严格来说这篇文章算不上C++范围的,不过还是挂了点边,还是在自己的blog中记录一下吧. C++中使用指针是家常便饭了,也非常的好用,这也是我之所以喜欢C++的原因之一.但是在C#中就强调托管的概念了,指针就不用想了.本来如果就在C#的世界里面写代码,也还算舒服,但是万事万物总有联系,这不,现在公司的另外一个用C#作的项目就碰到问题了,要调用之前用C++写的一个DLL中的一些函数,很多函数的参数都是指针类型的,这下可麻烦咯,公司里做C#的都是刚起步,C++又只有我最熟悉,这项技术研究工作又光荣的

二级指针的问题汇总

二级指针的问题 如何在被调用函数里面新建数据,然后将数据的地址传递出来呢? 一般来说有两种方法,第一种思路是将数据的首地址以返回值的方法返回,第一种方法如下: #include <stdio.h> #include <stdlib.h> #include <string.h> char *newBuf(int num) { char *p; p = (char *)malloc(num * sizeof(char)); return p; } void deleteBu

二级指针的简单运用

在C语言中,数组名就是一个指针常量,保存数组的首地址.因为数组名是一个常量指针常量,不能修改其指向的值,因此可以定义一个指针变量指向数组.这样使用数组名加下标可访问数组中的元素,使用指针名加下标也可访问数组中的元素.这些在本章前面已经介绍过了. 现在如果再定义一个二级指针变量,让其指向一级指针,就可使用二级指针变量操作数组.例如,使用以下语句定义二级指针变量: int a[10]; int *p=a; int **pp=&p; 这样,二级指针变量pp.一级指针变量p和数组a之间的关系,如图9-4

数组和指针作为函数参数——高质量C、C++编程指南

本文内容出自<高质量C.C++编程指南>.阅读之后理解,然后通过自己的话和例子讲清楚,这样才是学习之道.以下内容都是自己所认为的东西,如果哪里错了,希望各位大神指出. 1.数组作为函数的参数进行传递时,该数组自动退化为同类型的指针 结果: 第一张图中,str为数组,此时的长度为6,而作为函数参数时退化为指针了,指针的长度固定为4. 第一张图中,str为数组,所以不能对str进行自增或自减,而在函数中是可以的,因为退化为指针了,而指针时可以进行自增自减的. 2.指针参数是如何传递内存的 传递方式

C语言二级指针的介绍和使用

锄禾日当午,学C真TM苦. 指针是C语言中功能最强大的部分,但是也是最难理解的部分. 本文主要介绍二级指针的使用,包括与数组和函数结合的使用,一级指针简单带过. 一.一级指针 一级指针的简单描述 ①一级指针是一种以存储其他变量地址为目的的变量.一个T类型的指针变量(一级指针)就是一个存储了某T类型值变量的内存地址的引用. ②对指针的解引用(也就是*),是获取指针指向的内存空间中存储的值. ③当指针解引用做左值的时候,可以改变指针指向内存空间中存储的值. ④指针指向哪个变量,就将该变量的内存地址赋

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

(C++)函数参数传递中的一级指针和二级指针 主要内容: 1.一级指针和二级指针 2.函数指针传递的例子 3.什么时候需要传递二级指针? 4.二级指针在链表中的使用 1.一级指针和二级指针 一级指针:即我们一般说的指针,就是内存地址: 二级指针:指向指针的指针,就是地址的地址: 如: int a=1; int *p=&a; // p为a变量的地址,通过*p可以得到a的值 int **q=&p; // q为p指针的地址,通过**q可以得到a的值 2.函数指针传递的例子 程序1: 1 2 3