C++对指针形参及指针数组分配内存空间

2022-08-04 14:46:57

 在使用指针作为函数形参的时候,和数组首地址作为函数形参的用法一致。但指针和数组有一个重要区别是指针指向的地址可能为空,而数组的首地址一定会指向一段地址空间的。因此在使用指针作为函数形参,并在函数内申请内存空间时,传入的应该为指针的地址。而在释放该地址空间时,直接传该指针即可。

另外还要区分指针数组和数组指针的区别。运算优先级为 () > [] > *

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

//指针传递的是一个变量,或者一个值的地址,它本身还是采用值传递的方式。
//***不能使指针在函数内指向另一块地址,但可以改变它指向空间的值。***
//一维指针传参申请内存空间及赋值
//传入的应该是指针的地址
void fun(int** p) {
    *p = new int[5];

    for(int i=0;i<5;i++){
        //*p应该为一个单位进行赋值,表示的是取p的值(*p);()不可缺
        (*p)[i] = i;
    }
}
//数组传递,可以只传递数组首地址
void funa(int *p) {
    for(int i=0;i<5;i++){
        p[i] = i;
    }
}
//二维指针传参申请内存空间及赋值
//传入的应该是指针的地址
void fun2(int*** p) {
    *p = new int*[5];
    for(int i=0;i<5;i++){
        //*p应该为一个单位进行赋值,表示的是取p的值(*p);()不可缺
        (*p)[i] = new int[10];
        for(int j=0;j<10;j++){
            (*p)[i][j] = i + j;
        }
    }
}
//二维指针传参申请内存空间及赋值
//传入的应该是指针的地址
void fun3(int** p) {
    for(int i=0;i<5;i++){
        //*p应该为一个单位进行赋值,表示的是取p的值(*p);()不可缺
        p[i] = new int[10];
        for(int j=0;j<10;j++){
            p[i][j] = i + j;
        }
    }
}

//在进行地址释放的时候只需要传递该指针即可
void delfun(int *p){
    delete [] p;
}
void delfun2(int **p){
    for(int i=0;i<5;i++){
        delete [] p[i];
    }
    delete [] p;
}
void delfun3(int **p){
    for(int i=0;i<5;i++){
        delete [] p[i];
    }
    //delete [] p; 指针数组不需要释放最后一维
}


int main()
{
    int* p = NULL;
    int **p2 = NULL;
    int pa[5];
    //指针数组(数组中的值都是指针) []优先级高于*
    int *p3[5];
    fun(&p);
    funa(pa);
    fun2(&p2);
    fun3(p3);
    delfun(p);
    delfun2(p2);
    delfun3(p3);
    return 0;
}
  • 作者:xll_bit
  • 原文链接:https://blog.csdn.net/xll_bit/article/details/103496161
    更新时间:2022-08-04 14:46:57