在使用指针作为函数形参的时候,和数组首地址作为函数形参的用法一致。但指针和数组有一个重要区别是指针指向的地址可能为空,而数组的首地址一定会指向一段地址空间的。因此在使用指针作为函数形参,并在函数内申请内存空间时,传入的应该为指针的地址。而在释放该地址空间时,直接传该指针即可。
另外还要区分指针数组和数组指针的区别。运算优先级为 () > [] > *
#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;
}