C语言 之 二维数组与指针数组的定义认识、二维数组地址认识,二维数组与指针数组配合使用

目录

一、二维数组的地址认识

 1.代码演示

       运行结果:

2. 代码演示

       运行结果:

3.二维数组指针表现形式总结

 二、数组指针与二维数组

1.如何定义一个数组指针?

 代码演示:

数组指针注意事项

2.如何用数组指针访问二维数组的值?

代码演示:

运行结果:

3.数组指针和二维数组的配合使用

例题1:输入二维数组的行和列,找出对应二维数组行列的那个值。

代码演示:

运行结果:


一、二维数组的地址认识

访问二维数组值的示意图

 1.代码演示

#include<stdio.h>
int main()
{

	int arr[3][4] = {{1,3,5,7},{2,4,5,6},{11,22,33,44}};
	                                                          //三行四列的二维数组
	printf("arr是行的地址%p,偏移后行的地址是 %p \n",arr,arr+1);//二维数组偏移一个行地址,去介于列有多少个元素,这里是四列,类型为int型,所以行偏移16个字节大小。
	printf("arr[0]是列数组地址 %p ,偏移后地址是 %p \n",arr[0],arr[0]+1);
	printf("arr[0]是列数组地址 %p ,偏移后地址是 %p \n",*(arr+0),*(arr+0)+1);
	printf("arr[0]是列数组值 %d ,偏移后值是 %d \n", *(*(arr+0)) , *(*(arr+0)+1)  );
	
	return 0;
}

运行结果:

arr是父亲地址000000000061FDF0,偏移后地址是 000000000061FE00
arr[0]是子数组地址 000000000061FDF0 ,偏移后地址是 000000000061FDF4
arr[0]是子数组地址 000000000061FDF0 ,偏移后地址是 000000000061FDF4
arr[0]是子数组值 1 ,偏移后值是 3

2. 代码演示

#include<stdio.h>
int main()
{
	int arr[3][4] = {{1,3,5,7},{2,4,5,6},{11,22,33,44}};	
	int i,j;
	
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			printf("地址是%p,值是%d\n",&arr[i][j],arr[i][j]);    
			printf("地址是%p,值是%d\n",arr[i]+j,*(arr[i]+j));       //arr[i]+j  二维数组在这里arr[i]是数组名字
			printf("地址是%p,值是%d\n",*(arr+i)+j,*(*(arr+i)+j));
			
			putchar('\n');
		}
		putchar('\n');
	}


	return 0;
}
运行结果:
地址是000000000061FDE0,值是1
地址是000000000061FDE0,值是1
地址是000000000061FDE0,值是1

地址是000000000061FDE4,值是3
地址是000000000061FDE4,值是3
地址是000000000061FDE4,值是3

地址是000000000061FDE8,值是5
地址是000000000061FDE8,值是5
地址是000000000061FDE8,值是5

地址是000000000061FDEC,值是7
地址是000000000061FDEC,值是7
地址是000000000061FDEC,值是7


地址是000000000061FDF0,值是2
地址是000000000061FDF0,值是2
地址是000000000061FDF0,值是2

地址是000000000061FDF4,值是4
地址是000000000061FDF4,值是4
地址是000000000061FDF4,值是4

地址是000000000061FDF8,值是5
地址是000000000061FDF8,值是5
地址是000000000061FDF8,值是5

地址是000000000061FDFC,值是6
地址是000000000061FDFC,值是6
地址是000000000061FDFC,值是6


地址是000000000061FE00,值是11
地址是000000000061FE00,值是11
地址是000000000061FE00,值是11

地址是000000000061FE04,值是22
地址是000000000061FE04,值是22
地址是000000000061FE04,值是22

地址是000000000061FE08,值是33
地址是000000000061FE08,值是33
地址是000000000061FE08,值是33

地址是000000000061FE0C,值是44
地址是000000000061FE0C,值是44
地址是000000000061FE0C,值是44

3.二维数组指针表现形式总结

 二、数组指针与二维数组

能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?

1.如何定义一个数组指针?

 代码演示:

#include<stdio.h>
int main()
{
	int arr[3][4] = {{1,3,5,7},{2,4,6,8},{11,22,33,44}};	
	int i,j;

	int (*p)[4];   //数组指针的定义
	p = arr;       //将数组指针指向二维数组

	                //数组指针才是真正等同于二位数组
                    //有多少列数组就要定义多少列的数组指针,这里是arr是三行四列,所以int (*p)[4];
    return 0;
}

数组指针注意事项

1. 有多少列数组就要定义多少列的数组指针,这里是arr是三行四列,所以定义一个数组指针是            int (*p)[4];

2.数组指针 int (*p)[4]; 数组指针p++ 的偏移量是整行 ,一行有四个int型一个int型是4字节,所以这里偏移量是16字节

2.如何用数组指针访问二维数组的值?

代码演示:

#include<stdio.h>
int main()
{
	int arr[3][4] = {{1,3,5,7},{2,4,6,8},{11,22,33,44}};	
	int i,j;

	int (*p)[4];   
	p = arr;       
	
	printf("p = %p\n",p);
	printf("++p = %p\n",++p);  //数组指针 int (*p)[4]; p++ 的偏移量是整行 ,这里偏移量是16字节
	
	
	p = arr;
	
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			
			printf("arr %d  ",*(*(p+i)+j));  //用数组指针访问二维数组的第一种方式
			
		}
		putchar('\n');
	}
	
	putchar('\n');
	p = arr;
	
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			
			printf("arr %d ",p[i][j]);    //用数组指针访问二维数组的第二种方式
			
			
		}
		putchar('\n');
	}


	return 0;
}	
运行结果:
p = 000000000061FDE0       
++p = 000000000061FDF0     //++p后指针数组的偏移量是16个字节,++p是偏移数组的整行

arr 1  arr 3  arr 5  arr 7       //数组指针访问二维数组的第一种方式
arr 2  arr 4  arr 6  arr 8
arr 11  arr 22  arr 33  arr 44

arr 1 arr 3 arr 5 arr 7        //数组指针访问二维数组的第二种方式
arr 2 arr 4 arr 6 arr 8
arr 11 arr 22 arr 33 arr 44

3.数组指针和二维数组的配合使用

例题1:输入二维数组的行和列,找出对应二维数组行列的那个值。

代码演示:
#include<stdio.h>
void tipsInputHangLie(int *hang,int *lie)  //提示用户输入行列的值
{
	puts("请输入行的值");
	scanf("%d",hang);
	
	puts("请输入列的值");
	scanf("%d",lie);
}

int getTheData(int (*p)[4], int hang, int lie)   //找出对应行列值的那个数
{
/*
	int a;
	a = *(*(p+hang)+lie);
	
	return a;
*/

	return p[hang][lie];
}

int main()
{
	int arr[3][4] = {{1,3,5,7},{2,4,6,8},{11,22,33,44}};	
	int hang,lie;
	int data;


	tipsInputHangLie(&hang,&lie);
	data = getTheData(arr,hang,lie);
	printf("行%d 列%d 的值是%d",hang,lie,data);      //打印出找到的结果

	return 0;
}	

//6.17数组指针
运行结果:
请输入行的值
2
请输入列的值
2
行2 列2 的值是33

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值