鱼C论坛

 找回密码
 立即注册
查看: 3042|回复: 8

小甲鱼老师~或其他大侠麻烦进来鉴定一下~

[复制链接]
发表于 2011-8-20 00:45:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我是初学c的,看看我写的这段代码:
#include<stdio.h>
#include<math.h>

int main(){
    int level;
    scanf("%d",&level);
    int i;
    int a[level];
    for(i=level-1;i>=0;i--){
        a[i]=pow(2,i);
        printf("a[%d]=%d\n",i,a[i]);}
    getch();
    }

用dev c++ 5编译,能通过,其他编译器待验证~
请高手们鉴定一下,这是不是已经达到了动态定义数组?记得小甲鱼老师说是不可以动态定义数组长度的,但是这里ok了~
最大输入貌似是30左右,换成double型的a[]的话,最大不能确定,但是到56就丧失精度了~
求解!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-20 03:30:00 | 显示全部楼层
确定是动态了 在百度上找到了答案 dev C++ 新版本已经支持了 我用的也是dev C++ 5
运行正常 探索精神可加 我还没有试过
较早的编译器是不允许这样做的,所以一些书籍比如以Tc讲解的书本都说数组的下标不能是变量。在vc6.0下亦是如此。

不过在一些较新的编译器如dev c++已经支持了,如下代码不会报错
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.     int a; int i;
  6.     scanf("%d",&a);
  7.     int c[a];
  8.     for( i =0 ;i<a;i++)
  9.     scanf("%d",&c);
  10.    for( i =0 ;i<a;i++)
  11.     printf("%d",c);
  12. }
复制代码


这个和编译器有关,应该是设计到一些标准规范为题吧,最好还是不要这样写~使用动态分配内存是比较把握和通用的

一维:
cin>>n;
int* a=new int[n];
但是new出来的一定不要忘了delete掉
delete []a; // 正确的用法
delete a; // 错误的用法
后者相当于delete a[0],漏掉了另外n-1个对象。

二维:
设有m行n列
cin>>m>>n;
int **a = new int* [m];
for(int i = 0; i < m; i++)
  a = new int [n];
PS:就相当于产生了一个二维数组a[m][n]了,但是对于我们平时声明的数组a[m][n],a[j]=a[i*n+j],因为是连续的一片内存,而这样动态声明的数组任意的a[k]都是一个int*类型,即一个地址了,所以只能a[j]或者*(*(a+i)+j)来访问数组的元素,而不能a[i*n+j]这样转换着用了

释放内存:
for(int i = 0; i < m; ++i)
  delete []a;
delete []a;

PS:其实对于c++,我们完全可以充分利用它自己强大而方便的容器,比如vector,之所以动态声明数组,相比是大小不确定,声明太大了怕浪费空间,而vector就不用指定大小,当存的数据变多,自动扩大容量,比如假设vector默认大小是8,当你再往里存第9个元素时,容器自动扩容,变为16,16再不够用,扩为32,2倍2倍的增长,这样就根据需要扩容,不会浪费空间,也可以像普通数组那样直接指定vector的大小,总之普通数组可以的它都可以,普通数组没有的它更有;
一维:
vector<int> a;
a.push_back(k);
k为待存入数组的数,用法一样,可以a这样直接取数,还有各种自带的方法,使用方便极了
vector<int> a;
vector<int> a(5); //指定数组大小是5
vector<int> a(5,3); //数组大小为5,并初始化数组所有元素值为3
二维:
cin>>m>>n;//m行n列
vector<vector<int> > a(m, vector<int>(n)); //这行注意两个> >中间要加空格,否则会被认为是重载>>运算符
for (i = 0; i < m; i++)
  for (j = 0; j < n; j++)
      a[j] = i*j;
for (i = 0; i < m; i++)
  for (j = 0; j < n; j++)
     cout<<a[j]<<' ';
cout<<endl;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-20 03:31:10 | 显示全部楼层
本帖最后由 Be_envious 于 2011-8-20 03:32 编辑

我在百度知道找到的
http://zhidao.baidu.com/question/140175905.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-20 08:55:00 | 显示全部楼层
这怎么可能是动态数组呢!假如你scanf("%d",&level);输入20的话!这个内存也只能开辟20单元啊如果要现在要存储15个这个单元是足够了!如果一个星期之后我要存放30个你怎么办?他是不可以动的!要想实现一个内存空间动态当然首推!这两个函数malloc,realloca外加一指针
#include<stdio.h>
#include<malloc.h>
int main()
{
        int *x;
        x=(int *)malloc(10sizeoff(int));//动态开辟一个空间
        x=(int *)realloc(x,XXsizeof(int));//这就可以缩放这段空间了XX你你想扩展空间的数值
        free(x);//最后不想要里哦啊就释放这段空间
        return 0;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-8-20 09:47:54 | 显示全部楼层
谢谢二楼指导~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-8-20 09:53:34 | 显示全部楼层
想问三楼,我这个程序编译后只能让用户输入一个整形数,然后生成有该数数量的数组,并赋值a[i]为2^i次,显示完之后,就没有了,下次使用易依然要执行上述步骤,它也会开辟与用户输入数字相应的空间,这不算动态定义数组长度?不好意思,我刚学不久,不是很明白你的代码,我对指针还很陌生,谢谢谅解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-8-20 20:34:53 | 显示全部楼层
刚发现,6楼是问4楼的,不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-10 03:21:48 | 显示全部楼层
不敢说我的观念完全正确....就我所知,动态数组的意思是指
程序在执行时间可以"随意的更改数组大小".

假设程序中有两个scanf,即

scanf(....,&level);
int a[level];
...
scanf(....,&level);

那麽,第二个scanf过後,虽然你改变了level的值,
但是a数组的大小还是第一次scanf的值,
因此,这并不是真的动态.真正要达到动态应该还是要用棺材4楼提供的范例.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-18 03:44:57 From FishC Mobile | 显示全部楼层
编译时就已经分配数组空间了呀,这个编译器真能这样用吗?还有,你定义变量的方式,应该是C++里的吧,C只能在程序头定义,自上而下的编译,所以要先得到变量名,好分配空间,知道函数声明,好不产生函数未声明的报错信息。
我掌握的知识可能有些老了,要是真这样,请指正分享给我。期待你的分享。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 22:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表