C语言动态分配数组
2016-06-22 13:45
423 查看
如何动态的定义及使用数组呢?记得一般用数组的时候都是先指定大小的,后来又问了一位教C++的老师,他告诉我在C++里用new可以做到,一直不用C++,所以也不明白。今天在逛论坛时终于找到了C语言中的用法(看原贴):
一维数组:
int *a;
int N;
scanf("%d", &N);
a = (int *) malloc(N * sizeof(int));
....
free(a);
这样就动态分配了数组a
。数组的长度N可输入确定,也可用程序中的变量确定。但要注意程序结束后要用free()将其释放,否则内存会泄漏。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int *a;
int N;
printf("Input array length: ");
scanf("%d", &N);
printf("\n");
a = (int *) malloc(N * sizeof(int));//int 可以用*a来代替
for(i = 0; i < N; i++)
{
a[i] = i + 1;
printf("%-5d", a[i]);
if ((i + 1) % 10 == 0)
printf("\n");
}
free(a);
printf("\n");
return 0;
}
这样就完成了数组a
的动态分配,那么多维怎么分配呢?
二维数组
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nrows,ncolumns;
scanf("%d,%d",nrows,ncolumns);
区别的地方
//为数组分配行数 注意指针多了个*
int **array = malloc(nrows * sizeof(*array));//注意分配的是整形指针的数量 每行元素是个整形指针
/*这里可以写成
int **array;
array=(int**)malloc(nrows*sizeof(int*));//这里int可以写成**array
*/
//对每行分配数组个数(就是二维数组的列数)
for(i = 0; i < nrows; i++)
{
/*
这里int*可以写成*array 其实array是一个指向指针的指针变量,所以要将分配的内存转化为指针类型,在一台计算机中所有的指针变量分配的内存大小相同都是计算机的位数(就是地址线的条数,指针变量存放的是地址与地址线对应可以寻址)
*/
array[i] = (int*)malloc(ncolumns * sizeof(int));
for(l=0;l<ncolumns;l++)< p="" style="word-wrap: break-word;">
{
array[i][l]=...
}
}
//付初值以及处理过程
free(array);
return 0;
}
多维一个道理 每增加一维 输入数据就要多一个 定义指针的时候就多一个* 且分配的时候也要多个* 还要多个for循环
三维
#include <stdio.h>
#include <stdlib.h>
int main()
{
int rows,colnums,num;
scanf("%d %d %d",rows,colnums,num);
int ***p=malloc(rows*sizeof(*p));
/*
这里可以写成
int ***p;
p=(int***)malloc(rows*sizeof(int**));//int**可以写成*p
*/
for(int i=0;i<colnums;i++)< p="" style="word-wrap: break-word;">
{
p[i]=(int**)malloc(colnums*sizeof(int*));//**p
for(int j=0;j<num;j++)< p="" style="word-wrap: break-word;">
{
p[i][j]=(int*)malloc(num*sizeof(int));//这里可以写成*p
for(r=0;r<num;r++)< p="" style="word-wrap: break-word;">
{
p[i][j][r]=...
}
}
}
free(p);
return 0;
}
以上扩展内容纯熟个人总结(水平不高) 如果有哪里不对希望高手帮忙指出,谢谢.(暂时代码里面可能还有很多问题,我会慢慢修改)
现在代码应该没有什么问题了 如果还有什么问题请高手指出
一维数组:
int *a;
int N;
scanf("%d", &N);
a = (int *) malloc(N * sizeof(int));
....
free(a);
这样就动态分配了数组a
。数组的长度N可输入确定,也可用程序中的变量确定。但要注意程序结束后要用free()将其释放,否则内存会泄漏。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int *a;
int N;
printf("Input array length: ");
scanf("%d", &N);
printf("\n");
a = (int *) malloc(N * sizeof(int));//int 可以用*a来代替
for(i = 0; i < N; i++)
{
a[i] = i + 1;
printf("%-5d", a[i]);
if ((i + 1) % 10 == 0)
printf("\n");
}
free(a);
printf("\n");
return 0;
}
这样就完成了数组a
的动态分配,那么多维怎么分配呢?
二维数组
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nrows,ncolumns;
scanf("%d,%d",nrows,ncolumns);
区别的地方
//为数组分配行数 注意指针多了个*
int **array = malloc(nrows * sizeof(*array));//注意分配的是整形指针的数量 每行元素是个整形指针
/*这里可以写成
int **array;
array=(int**)malloc(nrows*sizeof(int*));//这里int可以写成**array
*/
//对每行分配数组个数(就是二维数组的列数)
for(i = 0; i < nrows; i++)
{
/*
这里int*可以写成*array 其实array是一个指向指针的指针变量,所以要将分配的内存转化为指针类型,在一台计算机中所有的指针变量分配的内存大小相同都是计算机的位数(就是地址线的条数,指针变量存放的是地址与地址线对应可以寻址)
*/
array[i] = (int*)malloc(ncolumns * sizeof(int));
for(l=0;l<ncolumns;l++)< p="" style="word-wrap: break-word;">
{
array[i][l]=...
}
}
//付初值以及处理过程
free(array);
return 0;
}
多维一个道理 每增加一维 输入数据就要多一个 定义指针的时候就多一个* 且分配的时候也要多个* 还要多个for循环
三维
#include <stdio.h>
#include <stdlib.h>
int main()
{
int rows,colnums,num;
scanf("%d %d %d",rows,colnums,num);
int ***p=malloc(rows*sizeof(*p));
/*
这里可以写成
int ***p;
p=(int***)malloc(rows*sizeof(int**));//int**可以写成*p
*/
for(int i=0;i<colnums;i++)< p="" style="word-wrap: break-word;">
{
p[i]=(int**)malloc(colnums*sizeof(int*));//**p
for(int j=0;j<num;j++)< p="" style="word-wrap: break-word;">
{
p[i][j]=(int*)malloc(num*sizeof(int));//这里可以写成*p
for(r=0;r<num;r++)< p="" style="word-wrap: break-word;">
{
p[i][j][r]=...
}
}
}
free(p);
return 0;
}
以上扩展内容纯熟个人总结(水平不高) 如果有哪里不对希望高手帮忙指出,谢谢.(暂时代码里面可能还有很多问题,我会慢慢修改)
现在代码应该没有什么问题了 如果还有什么问题请高手指出
C语言中怎样定义一个函数里面有数组然后在主函数中调用这个数组(指针函数)
相关文章推荐
- C/C++基础——set的基本操作总结
- CBF中for循环变矩阵乘法的思想(arrayfire)--复数矩阵
- C++中文件流(fstream)的使用方法及示例
- *leetcode #136 in cpp
- 浅析C++多态性
- Google C++ 编码规范(中文版)
- *leetcode #135 in cpp
- 国内C/C++刷题网站汇总
- C语言正则表达式详解 regcomp() regexec() regfree()详解
- *leetcode #134 in cpp
- c++对象内存布局(虚表和虚指针)
- C++ continue 和 break 的用法
- Win32下C++遍历目录和文件的源码
- C++ 输入字符串和string 类型总结
- C/C++中调用api设置mysql连接的编码方式
- static全解
- C++之类的成员函数的原理
- C++一些基础
- C++泛型和算法
- 数字之和(C++)