Java 和 C 在数组的定义、使用和特性上存在诸多差异,这些差异反映了两种语言的设计理念(如内存管理、类型系统等)。以下是主要区别:
malloc 分配)。 // 静态数组(栈上分配)
int arr1[5]; // 未初始化,元素值不确定
int arr2[5] = {1, 2, 3}; // 部分初始化,剩余元素为 0
int arr3[] = {1, 2, 3, 4}; // 自动推断长度为 4
// 动态数组(堆上分配)
int* arr4 = (int*)malloc(5 * sizeof(int)); // 需要手动计算内存大小
free(arr4); // 必须手动释放,否则内存泄漏new 初始化时确定)。 // 声明与初始化分离
int[] arr1;
arr1 = new int[5]; // 初始化为默认值(int 为 0)
// 声明时初始化
int[] arr2 = new int[]{1, 2, 3}; // 显式指定元素
int[] arr3 = {1, 2, 3, 4}; // 简化语法,编译器自动处理 int arr[5] = {1, 2, 3, 4, 5};
printf("%p\n", arr); // 输出数组首地址(与 &arr[0] 相同)
printf("%d\n", *(arr+2)); // 等价于 arr[2],输出 3Object),包含一个 length 属性记录长度。 int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr.length); // 直接获取长度,输出 5
System.out.println(arr); // 输出对象标识(如 [I@1b6d3586) int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 2 行 3 列,内存连续
int* row = matrix[0]; // 第一行的指针,row[1] 等价于 matrix[0][1] // 规则多维数组
int[][] matrix1 = new int[2][3]; // 2 行 3 列
// 锯齿数组(每行长度不同)
int[][] matrix2 = new int[2][];
matrix2[0] = new int[2]; // 第一行长度 2
matrix2[1] = new int[5]; // 第二行长度 5arr[i] 等价于 *(arr+i))。 int arr[3] = {1, 2, 3};
printf("%d\n", arr[5]); // 越界访问,结果未知(可能是垃圾值)ArrayIndexOutOfBoundsException 异常。 arr[i]),不支持指针算术。 int[] arr = {1, 2, 3}; // 函数接收的是指针,而非整个数组
void printArray(int* arr, int length) {
for (int i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int arr[] = {1, 2, 3};
printArray(arr, 3); // 必须手动传递长度
return 0;
}length 属性),无需额外传递长度。 static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) { // 直接使用 arr.length
System.out.print(arr[i] + " ");
}
}
public static void main(String[] args) {
int[] arr = {1, 2, 3};
printArray(arr); // 无需传递长度
}String[] 不能赋值给 Object[] 并存储非字符串元素)。 Arrays.copyOf() 等工具方法,C 需手动通过 memcpy 复制。 char* 数组,Java 中是 String 对象数组(管理更安全)。 C 的数组更接近底层内存,灵活但需要手动管理(长度、内存、越界),适合追求性能的系统级开发;Java 的数组是封装后的对象,提供了安全检查和自动管理,降低了出错风险,更适合应用层开发。两者的差异本质上是“手动控制”与“安全便捷”的设计理念分歧。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。