网站首页 > 精选教程 正文
对于数组,与指针变量总有千丝万缕的关系。
int arr[3][4] = {
1,2,3,4,
5,6,7,8,
9,10,11,12};
int base; // 以下三个地址值相同,但类型不同,尺寸不一
printf("%p\n",&arr); // 0012FF18
printf("%p\n",arr); // 0012FF18
printf("%p\n",arr[0]); // 0012FF18
printf("%p\n",&arr[0][0]); // 0012FF18
//取值需要不同级别的解引用
printf("%d\n",**arr); // 1
printf("%d\n",*arr[0]); // 1
printf("%d\n",arr[0][0]); // 1
printf("%p\n",base=(int)&arr[0][0]); // 0012FF18
// +1的偏移值是其类型尺寸的偏移
printf("%d\n",(int)(&arr+1)-base); // 48 sizeof(int)*4*3
printf("%d\n",(int)(arr+1)-base); // 16 sizeof(int)*4
printf("%d\n",(int)(arr[0]+1)-base); // 4 sizeof(int)
printf("%d\n",(int)(&arr[0][0])-base);// 0
一级指针,可以用一维数组名赋值。
而对于多维数组,与多级指针就不存在等价关系了。
对于n维数组,可以直接用一级指针去处理,因为n维数组在内存中也是线性存储的。
另外,n维数组,可以理解为其元素是n-1数组,这样,n维数组就可以用n-1维数组指针来表示。也可以用指针数组(其指针指向一个n-1维数组)来表示。所以从这个意义上说,这是一种降维的处理方式,对于符号“*”与“[]”,不是很严格地可以理解为有一定的等价性:
#include <iostream>
using namespace std;
int main()
{
int arr[3][4] = {
1,2,3,4,
5,6,7,8,
9,10,11,12};
int i,j;
cout<< "1 二维数组下标遍历"<<endl;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++) // 以下四种写法等价
// cout<<arr[i][j]<<"\t";
cout<<*(arr[i]+j)<<"\t";
// cout<<*(*(arr+i)+j)<<"\t";
// cout<<(*(arr+i))[j]<<"\t";
cout<<endl;
}
cout<<"2 二维数组看作线性一维来遍历"<<endl;
for(i=0;i<3*4;i++)
{
cout<<*(*arr+i)<<"\t";
if((i+1)%4==0)
cout<<endl;
}
cout<< "3 数组指针遍历二维数组"<<endl;
int (*ap)[4] = arr; // 行指针ap,指向arr每行的首地址
for(i=0;i<3;i++)
{
for(j=0;j<4;j++) // 以下四种写法等价
cout<<ap[i][j]<<"\t";
//cout<<*(ap[i]+j)<<"\t";
//cout<<*(*(ap+i)+j)<<"\t";
//cout<<(*(ap+i))[j]<<"\t";
cout<<endl;
}
cout<< "4 指针数组遍历二维数组"<<endl;
int* pa[3];
for(i=0;i<3;i++)
pa[i]=arr[i]; // 指针数组的元素是每行的首地址
for(i=0;i<3;i++)
{
for(j=0;j<4;j++) // 以下二种写法等价
cout<<pa[i][j]<<"\t";
cout<<endl;
}
cout<< "5 一级指针遍历二维数组"<<endl;
int* p; // 以下四种写法等价
p = (int*)arr;
p = &arr[0][0];
p = arr[0];
p = *arr;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++) // 以下二种写法等价
cout<<*(p+i*3+j)<<"\t";
//cout<<(p+i*3)[j]<<"\t";
cout<<endl;
}
for(i=0;i<3*4;i++)
{
//cout<<p[i]<<"\t";
cout<<*(p+i)<<"\t";
if((i+1)%4==0)
cout<<endl;
}
while(1);
return 0;
}
数组指针也可以指向一维数组,但写法细节略有区别:
int a[4] = {11,22,33,44};
cout<<&a[0]<<endl; // 一维数组首地址
cout<<a+1<<endl; // +1是偏移一个元素
cout<<&a+1<<endl; // +1是偏移整个数组的长度
int (*p1)[4] = &a;
cout<<(*p1)[2]<<endl; // 33
三维数组的遍历:
#include <iostream>
using namespace std;
int main()
{
int arr[2][3][4] = {0};
int* p = (int*)arr;
int i,j,k;
for(i = 0; i<2*3*4; i++)
*p++ = i+1;
p= arr[0][0]; // p = &arr[0][0][0];
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
for(k=0;k<4;k++) // 以下5种方式等价
//cout<< arr[i][j][k] <<" ";
//cout<< *(arr[i][j]+k) <<" ";
//cout<< *(*(arr[i]+j)+k) <<" ";
//cout<< *(*(*(arr+i)+j)+k) <<" ";
cout<< *(p+i*3*4+j*4+k) <<" ";
cout<<endl;
}
cout<<endl;
}
int (*ap)[3][4] = arr; // 如果将三维数组理解为层、行、列,则ap为层指针,指向每层的首地址
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
for(k=0;k<4;k++) // 以下两种方式等价
//cout<< ap[i][j][k] <<" ";
cout<< *(*(*(ap+i)+j)+k) <<" ";
cout<<endl;
}
cout<<endl;
}
while(1);
return 0;
}
/*
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)
本文暂时没有评论,来添加一个吧(●'◡'●)