指针数组、数组指针以及二维数组的参数传递

前言

区分一下指针数组和数组指针和二维数组做参数该怎么传递。。

指针数组和数组指针区分 在中间加个“的”即可理解,指针的数组 数组的指针

一、指针数组

指针数组,指针的数组。表示一个数组里面装的全是指针。
定义:int *p[5]; // []的优先级高于 **,先和p结合为数组,再由int *指明为指针
不能进行p++操作,因为p是数组头,是一个地址 而不是指针!!

例子:

#include <iostream>
using namespace std;
int main()
{
	int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
	int *p1[5];

	for (int i = 0; i < 5; i++)
	{
		p1[i] = a[i];//单独给数组里面的每个指针赋值
	}

	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			//以下三种形式都可以!
			//cout << p1[i][j] << " ";
			//cout << *(p1[i] + j)<< " ";
			cout << *(*(p1 + i) + j) << " ";
		}
		cout << endl;
	}
}

结果:
在这里插入图片描述

二、数组指针

数组指针,数组的指针。即为只想数组的指针,又称为行指针,只想一行数组的指针。
定义:int (*p)[3];//()的优先级最高,先指明p是一个指针,再指向一个大小为3的一维数组。
p++ 的意思是指向下一行数组。

例子:

#include <iostream>
using namespace std;
int main()
{
	int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
	int(*p2)[3];
	
	p2 = a;
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << (*p2)[j] << " ";
		}
		p2++;
		cout << endl;
	}
}

结果:
在这里插入图片描述

三、二维数组做参数传递

1.就用二维数组但是要表明行或者列

#include <iostream>
using namespace std;
void test(int aaa[][3])
{
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << aaa[i][j] << " ";
		}
		cout << endl;
	}
}
int main()
{
	int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
	test(a);
}

2. 用数组指针 (行指针)

#include <iostream>
using namespace std;
void test(int (*aaa)[3],int m)
{
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << (*aaa)[j] << " ";
		}
		aaa++;
		cout << endl;
	}
}

int main()
{
	int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
	test(a,5);
}

3. 用指针数组

#include <iostream>
using namespace std;
void test(int *aaa[5])
{
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << aaa[i][j] << " ";
			//cout << *(aaa[i]+j) << " ";
			//cout << *(*(aaa+i) + j) << " ";
		}
		cout << endl;
	}
}

int main()
{
	int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
	int* aa[5];
	for (int i = 0; i < 5; i++)
	{
		aa[i] = a[i];
	}
	test(aa);
}

4.用二维指针

#include <iostream>
using namespace std;
void test(int** aaa, int m, int n)//二维指针
{
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			//强制转换二维指针为一维,因为数组他的内存本身就是连续的!
			cout << *((int*)aaa + i * n + j) << " ";
			//cout << *(*(aaa+i) + j) << " ";//是错误的!因为aaa这个时候已经由数组退化为指针了,不知道数组的大小啦!
		}
		cout << endl;
	}
}

int main()
{
	int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
	test((int**)a,5,3);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值