一、概述
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