//二维数组的遍历方式
//一索引
//1,索引(要求:二维数组里的一维数组长度必须一样)
#include<stdio.h>
int main()
{
//1,定义格式
int arr[3][5] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
for (int i = 0; i < 3; i++)//i:表示二维数组中的索引
{
for (int j = 0; j < 5; j++)//依次表示一维数组的索引,遍历每一个一维数组
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
return 0;
}
//2.索引遍历(二维数组里的一维数组长度可以不相等)
//核心:事先把所有的一维数组定义完毕,再放到二维数组中
#include<stdio.h>
int main()
{
int arr1[] = { 1,2,3};
int arr2[] = { 4,5,6,7,8 };
int arr3[] = { 9,10,11,12,13};
int len1=sizeof(arr1) / sizeof(int);
int len2=sizeof(arr2) / sizeof(int);
int len3=sizeof(arr3) / sizeof(int);
int lenARR[3] = { len1,len2,len3 };
//int arr[3] = { arr1,arr2,arr3 };//存的一维数组的内存地址
int *arr[3] = { arr1,arr2,arr3 };//存的一维数组的值
//数组的数据类型,和内部存储的元素类型保持一致
for (int i = 0; i < 3; i++)
{
//i:依次表示二维数组的索引,范围:0,1,2
//错误做法:int len = sizeof(arr[i])/sizeof(int);//arr[i]退化为内存地址,在64位计算机中占8字节
for (int j = 0; j < lenARR[i]; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
return 0;
}
//二 指针遍历
//1第一种指针遍历方式
#include<stdio.h>
int main()
{
int arr[3][5] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
//要用int* int是一维数组的
//int(*p)[5]=arr;
//步长:类型长度*5=20;移动一步,跳过一个数组
//数据类型*p=arr
//数组指针的数据类型:要跟数组内部的元素的类型保持一致
//二维数组中存储的是一维数组int[5]
int (*p)[5] =&arr;//二维数组的数据类型int[5] /指针定义格式:数据类型*指针名
//数据类型是int[5] 一般写作int(*p)[5]
for (int i = 0; i< 3; i++)
{
//遍历一维数组
for (int j = 0; j < 5; j++)
{
printf("%d\t", *(*p + j));//*p二维数组,*(*p+j)遍历二维数组中的一维数组,通过偏移量j来遍历
}
//换行
printf("\n");
p++;//移动二维数组的指针,继续遍历下一个一维数组
}
return 0;
}
//2.指针遍历,第二种遍历格式
#include<stdio.h>
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[5] = { 6,7,8,9,16};
int arr3[5] = { 10,11,12,13,14 };
int* arr[3] = { arr1,arr2,arr3 };//数据类型 数组名[]
//二维数组存的实际上是一维数组的内存地址,所以类型要用int*
int** p = arr;
//int * (数据类型)*p
for(int i=0;i<3;i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d\t", *(*p+j));///p:二维数组地址 ; *p:指向二维中的一维; *p+j:一维数组的地址向前遍历;*(*p+j):解引用一维数组的数据
}
//换行
printf("\n");
//移动指针
p++;
}
return 0;
}