指针数组与数组指针的申请

大耗子 2020年02月23日 365次浏览

在平时的代码中,经常要使用到动态的指针数组,但指针数组特别容易和数组指针弄混,

因为对符号的优先级别没有弄清楚,导致用混,导致最后代码的结果不是自己想要的.

下面就是他们的申请方式.

#include <stdio.h>
#include <stdlib.h>

#define ROW 2
#define COL 3

void main()
{
	// 动态指针数组的申请1
	printf("动态指针数组的申请1:\n"); // 内存列连续,行不连续
	int **p = (int **)malloc(sizeof (int*)* ROW); // 申请ROW行
	for (int i = 0; i < ROW; i++) // 为每行申请COL块内存
		p[i] = (int *)malloc(sizeof (int)* COL);;
	for (int i = 0; i < ROW * COL; i++)
		p[i / COL][i % COL] = i;
	for (int i = 0; i < ROW * COL; i++)
		printf("%d ", p[i / COL][i % COL]);
	for (int i = 0; i < ROW; i++)
		free(p[i]);
	free(p);
	printf("\n****************************************\n");
	// 动态指针数组申请2
	printf("动态指针数组的申请2:\n"); // 内存全连续
	int(*pp)[COL] = (int(*)[COL])malloc(sizeof(int[COL]) * ROW);
	for (int i = 0; i < ROW * COL; i++)
		pp[i / COL][i % COL] = i;
	for (int i = 0; i < ROW * COL; i++)
		printf("%d ", pp[i / COL][i % COL]);
	free(pp);
	printf("\n****************************************\n");
	// 数组指针的写法
	printf("数组指针的写法:\n");
	int a[ROW][COL];
	int(*ppp)[COL] = a;
	for (int i = 0; i < ROW * COL; i++)
		ppp[i / COL][i % COL] = i;
	for (int i = 0; i < ROW * COL; i++)
		printf("%d ", ppp[i / COL][i % COL]);
	printf("\n****************************************\n");

}