程序设计与算法:C语言程序设计 知识点收录

二维数组

指针空间的申请malloc与释放free

  1. 申请了内存空间后,必须检查是否分配成功。
  2. 当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
  3. 这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会
    出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
  4. 虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。

指针的使用规范

  1. 定义指针的时候一定要初始化:三种方式
  • 初始化空指针
    int* pInteger = NULL;
  • 用已有的变量初始化
    int length=5;
    int* pInteger=&length;
    
  • 用内存分配函数给指针分配空间
    //为指针分配大小为10个整数的内存空间。
    int* pInteger=(int*)malloc(10*sizeof(int));
    
  1. 正确的申请和释放内存
    1、指针初始化,上面已讲
    2、正确的申请内存
    如何申请内存才算是正确的申请内存呢?首先要判断指针是否为空,如果不为空,则释放该指针所指向的内存块,如果不释放这块内存,而直接就申请内存,就会造成内存的泄露。申请内存后,一定要判断是否申请成功。
    3、内存释放
    程序使用完了指针,一定要记得释放指针指向的内存。释放后一定要记得设置指针为空指针。因为free函数在释放指针后,只是单纯的释放了该指针指向的内存空间,而没有将指针赋为空值。所以一定要记得在释放指针后将指针赋为空值。
  2. 使用指针时一定要判断指针是否为空

详细内容请看原博客:指针空间的申请与释放

二维数组做函数参数传递

参考:

/*
    二维数组做函数参数传递
*/
#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;

}


猜你喜欢

转载自blog.csdn.net/qipeng_master/article/details/88322442