没有长度的数组

 

有人说C语言是一个很诡异的语言,所以有时候我们会见到一些比较奇怪的定义,比如:

struct A{
 int a;
 int data[]
};

这个看起来确实很奇怪,为什么数组没有定义大小呢?

但实际上这段代码不仅可以通过大部分编译器,并且用途还很广泛。我工作的时候就遇到了不少这样的代码,并且还是比较关键的代码。

不过实际上事情并没有那么复杂和难以理解,不用看那些复杂的关于零长度数组是否符合C标准,以及不完整类型等等没见过的名词,其实道理很简单,C也不会专门为了这个而搞出来很复杂的规则。

让我们来看看,什么地方还会用到这样类似的东东:

int f(int array[])

{

...

}

 

int main(void)

{

int a[10];

...

f(a);

...

}

 

想想看,是不是一样的道理?

int a[]无论怎么用,都是一个意思,就是说明a是一个数组,但是不知道它的大小。

当然在struct A的定义中,与这里还是有些不同的,因为int data[]并没有占用实际的空间,sizeof(struct A) = 2(或者是4,依赖于平台)。 

 

另外,int data[0]在有些编译器上也可以通过,并且和int data[]具有相同的效果,所以上面的结构体声明可能看起来象下面这样:

struct A{
 int a1;
 int data[0];
};

这种写法不推荐使用,因为不符合C的标准,而且看起来更怪更难以理解。

 

引用别人的一个例子,就可以更深入的理解了:

#include "stdio.h"
#include "stdlib.h"
struct A{
 short a1;
 short next[0];
} * pA = NULL;

struct B{
 short a1;
 short next[1];
};

main()
{
    short abc[10];
    int i;
    printf("sizeof(struct A)=%d, sizeof(short)=%d, sizeof(struct B)=%d/r/n", sizeof(struct A), sizeof(short), sizeof(struct B));
    for (i=0; i<10; i++) abc[i] = i;
    pA = (struct A * ) abc;

    for (i=0; i<10; i++) {
         printf("i: %d, i.next:%d/r/n", pA->a1, pA->next[0]);
         pA++;
         /*
         注意与的不同,下面的语句要考虑到入栈的顺序,i和i.next的输出是相同的
         printf("i: %d, i.next:%d/r/n", pA->a1, pA++->next[0]);
         */
    };

    getch();
}

注:例子来源于http://www.etcell.com/soft/topicView.aspx?Id=38200,我是用baidu的cache看到的,看不到作者的名字,就不写了,大家看到了帮忙告诉我,我写上。另外,代码修改了一句,以便突出重点。

### Java 创建固定长度数组的示例 在 Java 中,创建固定长度数组是一个非常基础的操作。一旦数组被创建,其大小就无法更改[^2]。以下是一个完整的示例代码,展示如何创建一个固定长度的整型数组并初始化它: ```java public class FixedLengthArrayExample { public static void main(String[] args) { // 创建一个固定长度为5的整型数组 int[] numbers = new int[5]; // 初始化数组元素 numbers[0] = 10; numbers[1] = 20; numbers[2] = 30; numbers[3] = 40; numbers[4] = 50; // 遍历并打印数组元素 System.out.println("数组中的元素是:"); for (int i = 0; i < numbers.length; i++) { System.out.println("numbers[" + i + "] = " + numbers[i]); } } } ``` 在这个示例中,`int[] numbers = new int[5];` 创建了一个长度为 5 的整型数组。默认情况下,数组的所有元素都会被初始化为 `0`。然后通过索引逐一赋值给数组元素[^2]。 如果需要创建其他类型的固定长度数组,例如字符串数组或对象数组,可以参考以下示例: #### 字符串数组示例 ```java public class StringArrayExample { public static void main(String[] args) { // 创建一个固定长度为3的字符串数组 String[] names = new String[3]; // 初始化数组元素 names[0] = "Alice"; names[1] = "Bob"; names[2] = "Charlie"; // 遍历并打印数组元素 System.out.println("数组中的元素是:"); for (int i = 0; i < names.length; i++) { System.out.println("names[" + i + "] = " + names[i]); } } } ``` #### 对象数组示例 ```java class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return name + " (" + age + " years old)"; } } public class ObjectArrayExample { public static void main(String[] args) { // 创建一个固定长度为2的Person对象数组 Person[] people = new Person[2]; // 初始化数组元素 people[0] = new Person("Alice", 30); people[1] = new Person("Bob", 25); // 遍历并打印数组元素 System.out.println("数组中的元素是:"); for (int i = 0; i < people.length; i++) { System.out.println("people[" + i + "] = " + people[i]); } } } ``` 以上示例展示了如何创建不同类型的固定长度数组,并对它们进行初始化和访问[^4]。 ### 注意事项 - 数组长度在创建时确定后无法更改。 - 如果尝试访问超出数组范围的索引,会抛出 `ArrayIndexOutOfBoundsException` 异常。 - 推荐使用增强型 `for` 循环来遍历数组,简化代码逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值