歌词项目第一天|复习数组指针

复习:数组指针
1、二维数组
二维数组,有行,有列。二维数组可以看成有多个一维数组构成的,是多个一维数组的集合,可以认为二维数组的每一个元素是个一维数组。
例:

int a[3][5];

定义了一个3行5列的一个二维数组。
可以认为二维数组a由3个一维数组构成,每个元素是一个一维数组。
回顾:
数组的名字是数组的首地址,是第0个元素的地址,是个常量,数组名字加1指向下个元素

二维数组a中 ,a+1 指向下个元素,即下一个一维数组,即下一行。
例14:

#include <stdio.h>
int main(int argc, char *argv[])
{
		int a[3][5];
		printf("a=%p\n",a);
		printf("a+1=%p\n",a+1);
		return 0;
}

2、数组指针的概念:
本身是个指针,指向一个数组,加1跳一个数组,即指向下个数组。

3、数组指针的定义方法:
指向的数组的类型(*指针变量名)[指向的数组的元素个数]
int (*p)[5];//定义了一个数组指针变量p,p指向的是整型的有5个元素的数组
p+1 往下指5个整型,跳过一个有5个整型元素的数组。

例15:

#include<stdio.h>
int main()
{
		int a[3][5];//定义了一个3行5列的一个二维数组
		int(*p)[5];//定义一个数组指针变量p,p+1跳一个有5个元素的整型数组
		printf("a=%p\n",a);//第0行的行地址
		printf("a+1=%p\n",a+1);//第1行的行地址,a和a +1差20个字节
		p=a;
		printf("p=%p\n",p);
		printf("p+1=%p\n",p+1);//p+1跳一个有5个整型元素的一维数组
		return 0;
}

例16:数组指针的用法1

#include<stdio.h>
void fun(int(*p)[5],int x,int y)
{
p[0][1]=101;
}
int main()
{
		int i,j;
		int a[3][5];
		fun(a,3,5);
		for(i=0;i<3;i++)
		{
			for(j=0;j<5;j++)
			{
				printf("%d ",a[i][j]);
			}
			printf("\n");
		}
}

4、各种数组指针的定义:
(1)、一维数组指针,加1后指向下个一维数组
int(*p)[5] ;

配合每行有5个int型元素的二维数组来用
int a[3][5]
int b[4][5]
int c[5][5]
int d[6][5]
……
p=a;
p=b;
p=c;
p=d;
都是可以的~~~~
(2)、二维数组指针,加1后指向下个二维数组
int(*p)[4][5];
配合三维数组来用,三维数组中由若干个4行5列二维数组构成

int a[3][4][5];
int b[4][4][5];
int c[5][4][5];
int d[6][4][5];
这些三维数组,有个共同的特点,都是有若干个4行5的二维数组构成。
p=a;
p=b;
p=c;
p=d;
例17:

#include<stdio.h>
int main()
{
int a[3][4][5];
printf("a=%p\n",a);
printf("a+1=%p\n",a+1);//a和a+1 地址编号相差80个字节
//验证了a+1 跳一个4行5列的一个二维数组

int(*p)[4][5];
p=a;
printf("p=%p\n",p);
printf("p+1=%p\n",p+1);//p和p+1 地址编号相差也80个字节
return 0;
}

5、三维数组指针,加1后指向下个三维数组
int(*p)[4][5][6];
p+1跳一个三维数组;
什么样的三维数组啊?
由4个5行6列的二维数组构成的三维数组
配合:
int a[7][4][5][6];

6、四维数组指针,加1后指向下个四维数组,以此类推。。。。

7、注意:
容易混淆的内容:
指针数组:是个数组,有若干个相同类型的指针构成的集合
int *p[10];
数组p有10个int *类型的指针变量构成,分别是p[0] ~p[9]

数组指针:本身是个指针,指向一个数组,加1跳一个数组
int (*p)[10];
P是个指针,p是个数组指针,p加1指向下个数组,跳10个整形。

指针的指针:
int **p;//p是指针的指针
int *q;
p=&q;

8、数组名字取地址:变成 数组指针
一维数组名字取地址,变成一维数组指针,即加1跳一个一维数组
int a[10];
a+1 跳一个整型元素,是a[1]的地址
a和a+1 相差一个元素,4个字节

&a就变成了一个一维数组指针,是 int(*p)[10]类型的。
(&a) +1 和&a相差一个数组即10个元素即40个字节。

例18:

#include<stdio.h>
int main()
{
	int a[10];
	printf("a=%p\n",a);
	printf("a+1=%p\n",a+1);
	
	printf("&a=%p\n",&a);
	printf("&a +1=%p\n",&a+1);
	return 0;
}

a是个int *类型的指针,是a[0]的地址。
&a 变成了数组指针,加1跳一个10个元素的整型一维数组

在运行程序时,大家会发现a和&a所代表的地址编号是一样的,即他们指向同一个存储单元,但是a和&a的指针类型不同。

例19:

int  a[4][5];

a+1 跳5个整型
(&a)+1 跳4行5列(80个字节)。

总结:c语言规定,数组名字取地址,变成了数组指针。加1跳一个数组。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯智能台灯

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值