声明:
本文章涉及的主要知识点为:指针数组和数组指针的二级指针应用。本文作者为编程小白一枚,如有错误,欢迎各路大佬指正。
预备知识:
指针数组:看后缀,这是一个“数组”,就像整型数组,字符串数组一样,这不过这个数组中存储的数据类型是指针。
数组指针:看后缀,这是一个“指针”,用来指向数组的,可以通过该指针,访问数组中的元素。
二级指针:可以用来存储一级指针的地址;就像一级指针可以用来指向整型变量的地址等。
二维矩阵的数据结构:
完整源码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int rows = 2; //行
int cols = 3; //列
//array指向的是一个指针数组,其中存储的是一系列array[i],array[i]是指向数组的指针,即数组指针
// 这里的array代表的是一个指针数组,其中存储的是一系列指针,所以在创建时sizeof()中填入的是指针大小
int** array = (int**)malloc(rows * sizeof(int*));
if (array == NULL)
{
printf("内存分配失败!");
return -1;
}
//这里的array[i]就是一系列表示数组的指针的了
for (int i = 0; i < rows; i++)
{
array[i] = (int*)malloc(cols * sizeof(int)); //这里为每个指向数组的指针分配空间时,要循环开辟空间
if (array[i] == NULL)
{
printf("内存分配失败!");
return -1;
}
}
//数组的初始化(用户输入数据)
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
printf("请输入array[%d][%d]:",i+1,j+1);
scanf_s("%d", &array[i][j]);
}
}
// 打印数组
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%d ", array[i][j]);
}
printf("\n");
}
//内存释放
//内存释放时,先释放内层的数组指针,在释放外层的指针数组
for (int i = 0; i < rows; i++)
{
free(array[i]);
}
free(array);
return 0;
}
补充说明:
上面创建的二维矩阵的数据结构,在图的邻接表存储、解决哈希冲突中的链地址法,有类似的结构,但又有些不同。