| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1316 人关注过本帖
标题:关于数组定义
只看楼主 加入收藏
晓益
Rank: 4
来 自:江苏扬州
等 级:业余侠客
威 望:2
帖 子:85
专家分:220
注 册:2016-7-9
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:9 
关于数组定义
我这里有几个关于数组定义的方式:
1. int n=10, a[n];

2. int n=10;
   int a[10];

3. int n;
   scanf("%d", &n);
   int a[n];

4. #define N 10
   int a[N];


我想问的是:这些数组定义哪些是不正确的,又有哪些是某种C标准才能支持的定义,其它标准不支持的。又或者是否和编译器有关————望详细谢谢
PS:我的编译器(Visual C++ 6.0)一个不支持,所以对于声明一个能够让数组元素可变的变量时很苦恼。
搜索更多相关主题的帖子: 编译器 元素 
2016-07-26 18:16
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:3 
你声明的都是静态数组,所以基本上不会用变量作数组的下标(虽然有些编译器支持第一次读取的数值来确定数组大小),也不建议这样定义数组。
如果真想可变,就用malloc建立动态数组
2016-07-26 18:57
平常心q
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:120
专家分:550
注 册:2016-3-31
收藏
得分:3 
第二个,第四个是正确的,其实我们平时用数组时,只要会一种就可以,所以,没必要太担心了,记住一个、自己用着顺手就可以啦
2016-07-26 19:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:3 
第二个你是不是写错了?
int n=10;
我怀疑你想写成 int a[n]; 而非 int a[10];

如果确实是你手误,那么第一个、第二个、第三个完完全全一样,干嘛写三次?
2016-07-27 08:32
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:6 
首先二、四的格式是正确
再者C标准的数组定义一般情况是要求数组长度是固定的,这个固定可以是你直接指定数组下标数值大小(如你的二、四写法),另一个就是直接定义数组的时候直接初始化(如a[]={0,1,2}),这样编译器会自己判断数组长度。
如果按你说的想定义长度可以变化的数组,可以用malloc或者calloc定义动态数组(两者有点区别),详细的你可以百度,有固定的格式你可以套用,不理解也没关系。其实就是手动开辟一段内存,要记得最后要释放内存
2016-07-27 08:34
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
给你个例子看看理解下:
从这个例子可以看出calloc分配完存储空间后将元素初始化。
程序代码:
#include<stdio.h>
#include<stdlib.h>
int main(){
    int i;
    int* pn = (int*)calloc(10, sizeof(int));
    for(i = 0;i < 10;i++)
        printf("%d", pn[i]);
    printf("\n");
    free(pn);
    return 0;
}

输出十个0。
2016-07-27 08:37
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 4楼 rjsp
应该不是手误,我的理解:虽然几种方法理解起来结果是完全一样的,但文字表面看起来是不一样的,对于新手或者基础知识不牢固的人可能会弄混淆,以为是不同的定义方法。他应该是想尝试 长度可以变化的数组定义的写法,不过没有学过malloc()一类的函数,所以想当然的认为把数组下标定义为变量就可以实现动态数组的定义了。
(PS:最后一句的“想当然”可能有点不礼貌,但请各位看到不要误解,我没有一丝嘲讽或者轻视任何一个热爱C的同学的意思,只是找不到合适的词语来表达这个意思)
最后想多说一句的是:其实有很多问题我们在提问之后,可以不必执着等论坛的兄弟姐妹们给我们答案,同时我们也可以利用其它渠道或者方法来为我们自己释疑,比如网络,比如书籍,再比如查询一些函数库的文档。尤其是现在网络这么发达,很多东西一搜一堆相关内容,自己甄别学习,还是会有不错的收获的哦

[此贴子已经被作者于2016-7-27 08:49编辑过]

2016-07-27 08:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
回复 7楼 wanglianyi1
int n=10;
int a[10];
应该是手误,如果不是手误,那他就不会写那句无用的“int n=10;”

另外,他的这四段代码都是正确的,符合C标准的语法(虽然VLA因为微软捣乱被降为optional)

2016-07-27 09:00
晓益
Rank: 4
来 自:江苏扬州
等 级:业余侠客
威 望:2
帖 子:85
专家分:220
注 册:2016-7-9
收藏
得分:0 
回复 7楼 wanglianyi1
我是属于那种,以前囫囵吞枣看过一本C入门书籍,现在在买了一本习题集正在巩固,所以对于困惑的东西自然也就问了出来。

其实对于: #define N 10;
           int a[10];   //这种定义方式,书上说是对的,只是我的编译器不支持。 看来我也是需要考虑其它编译器了。

        

千里之行,始于足下。
思考问题伤细胞,得分不容易。解决完问题请尽快结贴
2016-07-27 09:08
晓益
Rank: 4
来 自:江苏扬州
等 级:业余侠客
威 望:2
帖 子:85
专家分:220
注 册:2016-7-9
收藏
得分:0 
回复 8楼 rjsp
不好意思确实手误。不过我的习题给出的答案是最后一种正确,其它都是错的。

千里之行,始于足下。
思考问题伤细胞,得分不容易。解决完问题请尽快结贴
2016-07-27 09:10
快速回复:关于数组定义
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.095684 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved