C 语言程序设计
二维数组
指针空间的申请malloc
与释放free
- 参考:指针空间的申请与释放
- 申请了内存空间后,必须检查是否分配成功。
- 当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
- 这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会
出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。 - 虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。
指针的使用规范
- 定义指针的时候一定要初始化:三种方式
- 初始化空指针
int* pInteger = NULL;
- 用已有的变量初始化
int length=5; int* pInteger=&length;
- 用内存分配函数给指针分配空间
//为指针分配大小为10个整数的内存空间。 int* pInteger=(int*)malloc(10*sizeof(int));
- 正确的申请和释放内存
1、指针初始化,上面已讲
2、正确的申请内存
如何申请内存才算是正确的申请内存呢?首先要判断指针是否为空,如果不为空,则释放该指针所指向的内存块,如果不释放这块内存,而直接就申请内存,就会造成内存的泄露。申请内存后,一定要判断是否申请成功。
3、内存释放
程序使用完了指针,一定要记得释放指针指向的内存。释放后一定要记得设置指针为空指针。因为free函数在释放指针后,只是单纯的释放了该指针指向的内存空间,而没有将指针赋为空值。所以一定要记得在释放指针后将指针赋为空值。 - 使用指针时一定要判断指针是否为空
详细内容请看原博客:指针空间的申请与释放
二维数组做函数参数传递
参考:
/*
二维数组做函数参数传递
*/
#include <stdio.h>
#include <stdlib.h>
/*方案一:第一维的长度可以不指定,但必须指定第二维的长度 */
void passArray1(int a[][5], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%3d", a[i][j]);
}
printf("\n");
}
}
/* 方案二:指向一个有五个元素一维数组的指针 */
void passArray2(int (*a)[5],int row, int col)
{
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%3d", a[i][j]);
}
printf("\n");
}
}
/* 方案三:利用数组是顺序存储的特性,通过降维来访问原数组 */
void passArray3(int *a, int row, int col)
{
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%3d", *(a+i*col+j));
}
printf("\n");
}
}
#define true 1
#define false 0
typedef int bool;
bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
int i, j, flag;
i = matrixRowSize-1;
j = 0;
flag = 0;
while (i >= 0 && j < matrixColSize)
{
if (matrix[i][j] == target)
{
flag = 1;
break;
}
else if(matrix[i][j] > target)
i--;
else
j++;
}
if (flag == 1)
return true;
else
return false;
}
int main()
{
int Mat[5][5] = {{1,4,7,11,15},{2,5,8,12,19},{3,6,9,16,22},{10,13,14,17,24},{18,21,23,26,30}};
//int Mat[][5] = {{1,4,7,11,15},{2,5,8,12,19},{3,6,9,16,22},{10,13,14,17,24},{18,21,23,26,30}};
//int Mat[5][5] = {1,4,7,11,15,2,5,8,12,19,3,6,9,16,22,10,13,14,17,24,18,21,23,26,30};
printf("方案一:\n");
passArray1(Mat, 5, 5);
printf("方案二:\n");
passArray2(Mat, 5, 5);
printf("方案三:\n");
passArray3(&Mat[0][0], 5, 5);
printf("方案四:\n");
int i, j, row, col;
row = 5;
col = 5;
// 指向指针的指针申请内存空间
int **arr = NULL;
arr = (int **)malloc(sizeof(int *)*row);
for (i = 0; i < row; i++)
{
arr[i] = (int *)malloc(sizeof(int)*col);
}
for (i = 0; i < row; i++)
{
for (j = 0; j < row; j++)
{
arr[i][j] = Mat[i][j];
printf("%3d", arr[i][j]);
}
printf("\n");
}
int target = 5;
if (arr != NULL) {
printf("%d\n", searchMatrix(arr, row, col, target));
}
// 释放内存
for (int i = 0; i < row; i++)
free(arr[i]);
free(arr);
arr = NULL;
}
- 一个很好的讲解:C语言 二维数组(指针)动态分配和释放