浅谈数组指针和指针数组

数组指针和指针数组

指针数组

int *arr1[10];
int **arr3[5];

本质上是数组,只不过是数组中存储的是指针。

数组指针

int(*arr4)[10];

本质上是指针,是能够指向数组的指针。使用方法,直接上代码。

void print_arr1(int arr[3][5], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}

void print_arr2(int (*arr)[5], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}

int main()
{
	int arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	print_arr1(arr, 3, 5);
	print_arr2(arr, 3, 5);

	return 0;
}

  这里面的print_arr1和print_arr2是两种数组指针的使用的方法。
分析代码意思

int main()
{
	//数组
	int arr[5];
	//指针数组
	int *parr1[10];
	//数组指针
	int(*parr2)[10];
	//指针数组的数组   数组中存放10个指针,这10个指针指向10个数组,这10个数组每个数组的大小是5
	int(*parr3[10])[5];

	return 0;
}

&数组名VS数组名

直接上代码

int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr);
	return 0; 
}

在这里插入图片描述
  通过代码运行的结果,我们好像很难发现区别,但实际上两个表达的含义是不一样的,通过下面的代码可以验证。

int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr);
	printf("%p\n", arr + 1);
	printf("%p\n", &arr + 1);
	return 0; 
}

在这里插入图片描述

  我们通过观察运行结果发现,当给两个都加上1时,表示的结果就不一样了,数组名得到的是数组首元素的地址,加一时,加数据类型个大小,&数组名得到的时数组的地址,加一时,加数组个大小,因为数组一共10个元素,每个元素是4个字节,因此加了40个字节的大小。

猜你喜欢

转载自blog.csdn.net/weixin_43580319/article/details/111823415
今日推荐