数组指针,指针数组

数组指针和指针数组的声明:

#include <stdio.h>
int main()
{
	int m[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };/* 定义二维数组m并初始化*/
	int(*p)[4];//数组指针  p是指针,指向一维数组,每个一维数组有4个int元素
	//p(数组)的元素可以有任意个,通过malloc或者赋值来进行初始化,其中每个元素拥有4个int型元素
	int i, j;
	int *q[3];//指针数组 q是数组,数组元素是指针,3个int指针
	//q是数组,每个数组元素都是int型指针,数组总共有3个元素。如果元素代表的是数组,那么每个元素所指向数组的元素个数是不固定的。
	p = m;    //p是指针,可以直接指向二维数组
	printf("--数组指针输出元素--\n");
	for (i = 0; i<3; i++)/*输出二维数组中各个元素的数值*/
	{
		for (j = 0; j<4; j++)
		{
			printf("%3d ", *(*(p + i) + j));
		}
		printf("\n");
	}
	printf("\n");
	for (i = 0; i<3; i++, p++)//p可看成是行指针
	{
		printf("%3d ", **p);//每一行的第一个元素
		printf("%3d ", *(*p + 1));//每一行的第二个元素
		printf("%3d ", *(*p + 2));//每一行的第三个元素
		printf("%3d ", *(*p + 3));//每一行的第四个元素
		printf("\n");
	}
	printf("\n");
	printf("--指针数组输出元素--\n");
	for (i = 0; i<3; i++)
		q[i] = m[i];//q是数组,元素q[i]是指针
	for (i = 0; i<3; i++)
	{
		for (j = 0; j<4; j++)
		{
			printf("%3d ", q[i][j]);//q[i][j]可换成*(q[i]+j)
		}
		printf("\n");
	}
	printf("\n");
	q[0] = m[0];
	for (i = 0; i<3; i++)
	{
		for (j = 0; j<4; j++)
		{
			printf("%3d ", *(q[0] + j + 4 * i));
		}
		printf("\n");
	}
	printf("\n");
	return 0;
}

由上面的代码可以分析:

int(*p)[4];

数组指针,就是一个指针,这个指针是指向一个数组,而这个数组里面存放的是元素数固定的数组,也就是说以元素数固定的数组作为元素的指针变量。比如上面的这个声明中,指针p指向数组,每个数组中的元素有4个int型元素。

int *q[3];

指针数组,就是一个数组,这个数组里面的元素是指针,每一个元素所指向的数组所对应的元素数是不固定的。


int main()
{
	int *matrix1[3];   // array of 10 pointers
	int(*matrix2)[10]; // pointer to an array of 10 ints
	matrix2 = NULL;
	//指针数组里面的变量对应的内存块有可能是分散的,也可以表示多维数组
	matrix1[0] = new int[3];
	matrix1[1] = new int[4];
	matrix1[2] = new int[5];
	int tt = 0;
	for (int i = 0; i < 3; ++i)
	{
		for (int j = 0; j < i + 3; j++)
		{
			//两种初始化方法
			//matrix1[i][j] = tt++;
			*(*(matrix1 + i) + j) = tt++;   
		}
	}

	//数组指针中的内存块必须是连续的才可以表示多维数组
	tt = 0;
	matrix2 = new int[][10];
	int(*matrix3)[10] = matrix2;
	for (int i = 0; i < 2; ++i)
	{
		for (int j = 0; j < 10; j++)
		{
			//两种初始化方法
			*(*matrix3 + j) = tt++;
			//*(*(matrix2 + i) + j) = tt++;
		}
		matrix3++;
	}

	return 0;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值