网站首页 > 精选教程 正文
数组作为函数参数时会转变为指针。怎样转变呢?将数组名转变为指向数组首元素的指针变量。如有三维数组:
int arr[3][4][5];
arr的类型信息是int[3][4][5],&arr+1表达式中的“+1”移动的是3*4*5*sizeof(int)个字节。
arr[0]的类型信息是int[4][5],arr+1表达式中的“+1”移动的是4*5*sizeof(int)个字节。
arr[0][0]的类型信息是int[5],arr[0]+1表达式中的“+1”移动的是5*sizeof(int)个字节。
arr[0][0][0]的类型信息是int,arr[0][0]+1表达式中的“+1”移动的是sizeof(int)个字节。
经过三级解引用可以取其具体值:
int v = arr[2][2][2];
数组名转变为指针变量,要求数组的维数与指针的级数有一致关系,要求一定程度上保留长度信息,要求指针的算术运算(如上述的“+1”操作)能满足指针移动的实际需要。
答案就是将第一维转变为指针,剩下的维度(如果是n维的话,剩下n-1维)表示数组类型,也就是转变为指向数组元素的指针。如果一个n维数组,其数组元素为n-1维数组,这个指针变量指向一个n-1维数组,也就是一个n-1维数组指针。
int arr[3][4][5]; // 具有第一、二、三维的长度信息
int (*p)[4][5] = arr; // 数组指针引用数组,需补充第一维的长度信息
int *p1 = arr[0][0]; // 一级指针引用数组,需补充第一、二、三维的长度信息
此时的指针变量p的级数与数组arr的维数具有一致性,p的算术运算能够符合指针移动的需要。p虽然有了指针的灵活性(arr是一个常量),但却丧失掉了第一维的长度信息。数组在声明数组指针时,其它维度都必须是常量,在用做函数参数时,不如用一个一级指针来引用数组来得方便:
#include <iostream>
using namespace std;
void output2dArray(int(*arr)[4],int row)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<4;j++)
//cout<<arr[i][j]<<" ";
//cout<<(*(arr+i))[j]<<" ";
//cout<<*(arr[i]+j)<<" ";
cout<<*(*(arr+i)+j)<<" ";
//cout<<*(*arr+i*4+j)<<" ";
cout<<endl;
}
cout<<endl;
}
void output2dArrayP(int* arr,int row,int col)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
cout<<*(arr+i*col+j)<<" ";
cout<<endl;
}
cout<<endl;
}
void output3dArray(int(*arr)[3][4],int layer)
{
for(int i=0;i<layer;i++)
{
for(int j=0;j<3;j++)
{
for(int k=0;k<4;k++)
cout<<arr[i][j][k]<<" ";
//cout<<*(arr[i][j]+k)<<" ";
//cout<<*(*(arr[i]+j)+k)<<" ";
//cout<<*(*(*(arr+i)+j)+k)<<" ";
//cout<<(*(*(arr+i)+j))[k]<<" ";
//cout<<(*(arr+i))[j][k]<<" ";
//cout<<*(**arr+i*3*4+j*4+k)<<" ";
cout<<endl;
}
cout<<endl;
}
cout<<endl;
}
void output3dArrayP(int* arr,int layer,int row,int col)
{
for(int i=0;i<layer;i++)
{
for(int j=0;j<row;j++)
{
for(int k=0;k<col;k++)
cout<<*(arr+(i*row+j)*col+k)<<" ";
cout<<endl;
}
cout<<endl;
}
cout<<endl;
}
int main()
{
int arr2[3][4]= {1,2,3,4,5,6,7,8,9,10,11,12};
output2dArray(arr2,3);
output2dArrayP(arr2[0],3,4);
int arr3[2][3][4]= {1,2,3,4,5,6,7,8,9,10,11,12,
13,14,15,16,17,18,19,20,21,22,23,24};
output3dArray(arr3,2);
output3dArrayP(arr3[0][0],2,3,4);
while(1);
return 0;
}
/*
1 2 3 4
5 6 7 8
9 10 11 12
1 2 3 4
5 6 7 8
9 10 11 12
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
21 22 23 24
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
21 22 23 24
*/
-End-
猜你喜欢
- 2024-11-16 面向JVM编译-类实例、数组的创建和使用
- 2024-11-16 来,一起聊聊Excel中的数组(excel数组公式有哪些)
- 2024-11-16 数组的维数及数组公式的讲解(数组维的大小)
- 2024-11-16 C语言中数组的类型和使用(c语言中数组的概念及作用)
- 2024-11-16 C# - 多维与交错数组 036(交错数组和多维数组有何区别?)
- 2024-11-16 Numpy第6练:如何操控数组的维度与形状?干货满满!
- 2024-11-16 NumPy之:多维数组中的线性代数(numpy 多维数组)
- 2024-11-16 S7-1200 数组数据类型(ARRAY)(s71200plc数据类型)
- 2024-11-16 JAVA中如何调用matlab并返回运算结果?
- 2024-11-16 Java基础03(java基础案例教程第二版)
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)