c/c++:指针作为函数参数

File : pointer parameter.cpp
Type : c/c++
Brief : pointer parameter


/* 
 * 指针没有完全理解
 * 将指针当成一个变量
 * 函数传指针,可以改变指针指向的地址的值,但不能改变指针指向的地址
 * 要改变指针指向的地址,就要传指针变量的地址,即二级指针
 */
 
/*
 *  var: **str = "hello"
    addr.   value.
    str     *str
    *str    **str == "hello"
 */

#include <iostream>
#include <string.h>

using namespace std;

typedef char* charptr;

// 指针类型的传值过程,p中存的地址不会保存到实参
void get1(char* p)
{
    p = new char[100];
}
void get2(charptr p)
{
    p = new char[100];
}

// get3和get4等价,指针类型的传址过程,*p保存的地址可以保存到实参
// get5为传递指针的引用,可以改变指针变量中存的地址
void get3(char **p)
{
    *p = new char[100]; 
}
void get4(charptr *p)
{
    *p = new char[100];
}
void get5(char*&p)
{
    p = new char[100];
}

// 函数中申请的内存空间不会释放,临时存放地址的变量t释放掉了,但cp指向了内存空间地址
char *cp;
void get6()
{
    char *t = new char[100];
    cp = t;
}

// 申请二组数组的内存空间
// 格式: T* x = new T[n]
// 格式: T* x = (T*)malloc(sizeof(T) * n);
// n1 : 第一组的长度,即二维数组的行
void get7(int n1,char**& p)
{
    /*
    char* str[3];
    *(str + 0) = (char*) tmp;
    str也是指针数组,也是二级指针,因为str作为数组是一个地址,而str存储的也是char*指针
    */  
    p = new char*[n1];
    *(p + 1) = new char[20];
    /*
    p = (int **)malloc(sizeof(int*) * n1);
    *(p + 1) = (int *)malloc(sizeof(int) * 10);
    */
    strcpy(*(p+1),"hello 2d");
}


int main(int argc, char *argv[])
{
    charptr str = nullptr;
    //get4(&str);                   //传址
    get5(str);                      //指针的引用
    strcpy(str,"hello world");
    cout <<str << endl;
    
    char ** str2 = nullptr;
    get7(5,str2);
    cout << *(str2+1) << endl;
    
    return 0;
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [ yehuohan@gmail.com ]

文章标题:c/c++:指针作为函数参数

本文作者:Y

发布时间:2017-08-09, 13:37:27

最后更新:2019-05-21, 20:06:11

原始链接:http://yehuohan.github.io/2017/08/09/Gist/c&c++/pointer-parameter/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。