一、概述
C语言是不能直接定义动态数组的,数组必须在初始化时确定长度。
如果要在程序运行时才确定数组的长度,就需要在运行的时候,自己去向系统申请一块内存用动态内存分配实现动态数组。
二、动态内存分配函数
1、malloc()函数
void *malloc(unsigned int size)
分配size个字节的内存空间,返回地址的指针,如果内存不够分,就返回空指针NULL。 注意:返回的指针是没有类型的,所以要使用得强制类型转换。
2、calloc()函数
void *calloc(unsigned int num, unsigned int size)
这个也是申请动态内存空间,不过就是分开了而已。 一共申请num个长度为size字节的内存空间。
3、free()函数
void free(void *p)
释放指针p内存空间。
这个很重要!!!!很重要!!!重要!!!
4、realloc()函数
void *realloc(void *p, unsigned int size)
给指针p申请的存储空间改为size个字节,返回的是存储空间首地址(指针)
三、动态数组实现
1、一维动动数组实现
dynamicArrayOneDimensional.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <stdio.h> #include <stdlib.h> /************************************************** dynamicArrayOneDimensional.c 输入N个数,求平均数 **************************************************/ main() { int *p = NULL, n, i, sum; printf("Please enter array size:"); scanf("%d", &n); /* 申请地址n个长度为sizeof(int)的连续存储空间 */ p = (int *)malloc(n * sizeof(int)); if(p == NULL) { printf("No enough memory!\n"); exit(0); } printf("Please enter the score:"); for(i = 0; i<n; i++) { scanf("%d", p+i); } sum = 0; for(i = 0; i<n; i++) { sum = sum + *(p + i); } printf("aver = %d\n", sum/n); free(p); } |
2、二维动态数组的实现
dynamicArrayTwoDimensional.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
#include <stdio.h> #include <stdlib.h> int findMax(int *p, int m, int n, int *pRow, int *pCol); int main() { int *pScore = NULL, i, j, m, n, maxSocre, row, col; printf("Please enter array size m,n:"); scanf("%d, %d", &m, &n); pScore = (int *) calloc(m*n, sizeof(int)); if(pScore == NULL) { printf("No enough memory!\n"); exit(0); } printf("Please enter the score:\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &pScore[i*n+j]); } } maxSocre = findMax(pScore, m, n, &row, &col); printf("maxSocre = %d, class = %d, number = %d\n", maxSocre, row+1, col+1); free(pScore); return 0; } int findMax(int *p, int m, int n, int *pRow, int *pCol) { int i, j, max; max = p[0]; *pRow = 0; *pCol = 0; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (p[i*n+j] > max) { max = p[i*n+j]; *pRow = i; *pCol = j; } } } return (max); } |
原文地址:http://yingbing.github.io/blog/2015/01/31/dynamic-array/
来源:https://www.cnblogs.com/yingbing/p/4265020.html