C/C++指针与数组

数组指针和指针数组

在二维数组传参时,经常遇到这样的问题,不能将”int ** “转换为”int (*)[5]“,虽然二维数组a[5][5]的a是二级指针,但是用int **是单纯的二级指针,但是二维数组的a是完全不同的。a[0]表示第一行一维数组,a[1]表示第二行二维数组,a是具有结构的,这一点和普通的二级指针具有很大的区别。

数组指针

int (*p)[5]是数组指针,又称为行指针。为了方便记忆,数组指针可以想成是“二维数组要用到的指针“好了。
指针p指向一个由5个元素组成的整形数组指针。
p+1相对于p的位置移动了5个元素的内存单位。
int a[5][5], (*p)[5] = a;
如此一来就将p这个数组指针指向了二维数组的a.

指针数组

char *p[5],就是说p[0],…,p[4]都是指向一个char型的指针。一般来说,这样的就是一个存储了不同长度的字符串数组罢了。
比如:char *name[]={“Monday”,”Tuesday”,…}

二维数组传参时要注意的问题

一维传参

形参:
int maxA(int a[], int n)
int maxB(int *a, int n)
以上两种写法是一样的,没有任何区别。
实参:
int a[10],*p;
p = a;
maxA(a,10)和maxB(p,10)是一样的。
原因很简单,传入的只是个地址,还有并且还有类型,以便编译器寻址用。对于一维数组,上面两种写法是一样的。

二维传参

int a[2][3]和int a[][3]是等价的,但最多只能省略第一维的大小,不能省略其他维,因为实参传过来的只是数组的初始地址,不说明列参数,则无法确定在第几个元素开始“换行”,即无法确定数组在内存中的位置。
//二维数组传参问题示例

//二维数组传参问题示例
#include<iostream>
using namespace std;
//方法1:传递数组,注意第二维必须标明
void fun1(int arr[][3], int iRows)
{
    for (int i = 0; i<iRows; i++)
    {
        for (int j = 0; j<3; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;
}
//方法二:一重指针,这种方法和第一种其实是一样的,只是写法不同而已。
void fun2(int(*arr)[3], int iRows)
{

    for (int i = 0; i<iRows; i++)
    {
        for (int j = 0; j<3; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;
}
//方法三:指针传递,不管是几维数组都把他看成是指针,
void fun3(int*arr, int iRows, int iCols)
{
    for (int i = 0; i<iRows; i++)
    {
        for (int j = 0; j<iCols; j++)
        {
            cout << *(arr + i*iCols + j) << " ";
        }
        cout << endl;
    }
    cout << endl;
}
//方法4:利用二级指针。不过内部不能直接写arr[i][j],因为这样不能正确寻址,要模拟编译器寻址。
void fun4(int**arr, int iRows, int iCols)
{
    for (int i = 0; i < iRows; i++)
    {
        for (int j = 0; j < iCols; j++)
        {
            cout << *((int*)arr + i*iCols + j) << " ";
        }
        cout << endl;
    }
    cout << endl;
}
int main()
{
    int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
    int k[2][3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    cout << "fun1" << endl;
    fun1(a, 2);
    cout << endl;
    cout << "fun2" << endl;
    fun2(a, 2);
    cout << endl;
    //此处必须进行强制类型转换
    //所以必须强制转换成指针,如果a是一维数组则不必进行强制类型转换
    cout << "fun4" << endl;
    fun4((int**)a, 2,3);
    //此处必须进行强制类型转换
    //所以必须强制转换成指针,如果a是一维数组则不必进行强制类型转换
    cout << "fun3" << endl;
    fun3((int*)a, 2, 3);
    cout << "fun3" << endl;
    fun3((int*)k, 3, 3);
    cout << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值