3. 数组

1.堆栈特点:

基本数据类型的变量和对象的引用变量都是在函数栈内存中分配;

堆内存用于存放由new创建的对象和数组;

若数组和对象指向Null时会被视为垃圾被垃圾回收器回收以释放内存;

---------------------------------------------------------------------

2.数组

int [] x=new int[3];

int [] x={1,2,3};

int [] x=new int[]{1,2,3};


选择排序:(最值先排左)

for(int x=0;x<arr.length-1;x++){

for(int y=x+1;y<arr.length;y++){

if(arr[x]>arr[y])

...

冒泡排序:(最值先排右)

for(int x=0;x<arr.length-1;x++){

for(int y=0;y<arr.length-x-1;y++){

if(arr[y]<arr[y+1])

...

}

}


------------------------------

十进制转二进制:Integer.toBinaryString();//类似的查api;

------------------------------

3.二维数组:

可如下创建:

int [][]arr=new int[3][];

arr[0]=new int[3];

arr[1]=new int[1];

arr[2]=new int[2];

则arr.length=3;

arr[0].length=3;

arr[1].length=1;

arr[2].length=2;


则arr[0][1]=90;

arr[1][1]=89;

arr[2][2]=78;


注意:int []x,y[];//x是一维数组;y是二维数组;

y[0]=x;//true

y[0][0]=x;//false

y[0][0]=x[0];//true

<think>在C语言中,数组名代表数组首元素的地址,即数组名是一个指向数组第一个元素的指针常量。下面我们结合引用内容分析各个选项: 1. **数组全部元素的值**:数组名并不包含所有元素的值,它只是一个地址标识符。 2. **数组元素的个数**:数组大小信息并不存储在数组名中,需要通过`sizeof`运算符计算。 3. **数组首个元素的值**:数组名代表地址而非第一个元素的实际值(但通过解引用数组名可获得该值)。 4. **数组首地址**:这是正确答案。根据C语言规范,数组名在大多数情况下会转换为指向其首元素的指针[^1][^2]。 ### 详细说明 - 当声明`int arr[5];`时,`arr`的类型是`int[5]`(数组类型),但在表达式中(除`sizeof`和`&`操作外),它会自动转换为`int*`类型,指向`arr[0]`。 - 例如:`printf("%p", arr);`输出的是数组首地址,与`&arr[0]`相同。 ### 相关引用支持 引用[1]指出数组名是数组的标识符,引用[2]提到数组名用于命名数组,而引用[3]虽讨论变长数组,但未改变数组名的本质含义。核心规范是:**数组名即首元素地址**。 ### 示例验证 ```c #include <stdio.h> int main() { int arr[3] = {10, 20, 30}; printf("首元素地址: %p\n", (void*)arr); // 输出数组名(即首地址) printf("首元素值: %d\n", *arr); // 解引用数组名得到首元素值 printf("首元素地址: %p\n", (void*)&arr[0]); // 直接取首元素地址 return 0; } ``` 运行结果将显示`arr`与`&arr[0]`的值相同。 ### 结论 正确答案是:**数组首地址**。 §§相关问题§§ 1. 如何通过数组名访问数组的第二个元素? 2. `sizeof(数组名)`在C语言中返回什么? 3. 为什么数组名作为函数参数传递时会退化为指针? 4. 数组名和指针变量在内存表示上有何区别? </think> 在C语言中,数组名代表的含义是**数组首地址**。下面进行详细解释: ### 数组名的本质 1. **数组名是首元素的地址** 数组名在表达式中会自动转换为指向数组第一个元素的指针。例如: ```c int arr[5] = {1, 2, 3, 4, 5}; // arr 等价于 &arr[0] ``` 此时 `arr` 的类型是 `int*`,其值等于第一个元素 `arr[0]` 的内存地址[^1][^2]。 2. **例外情况** 以下两种操作中数组名**不会**转换为指针: - 使用 `sizeof(arr)`:返回整个数组的字节大小 - 使用 `&arr`:返回整个数组的地址(虽然值与 `arr` 相同,但类型是 `int(*)[5]`) ### 选项分析 | 选项 | 正确性 | 说明 | |------|--------|------| | 数组全部元素的值 | ❌ | 数组名仅代表地址,不包含元素值 | | 数组元素的个数 | ❌ | 需通过 `sizeof(arr)/sizeof(arr[0])` 计算 | | 数组首个元素的值 | ❌ | 数组名是地址,需用 `*arr` 才能获取值 | | **数组首地址** | ✅ | 核心特性:指向内存中数组起点 | ### 示例说明 ```c #include <stdio.h> int main() { int n[3] = {10, 20, 30}; printf("数组首地址: %p\n", (void*)n); // 输出类似 0x7ffd42a printf("首元素地址: %p\n", (void*)&n[0]); // 与上一行相同 printf("首元素值: %d\n", *n); // 解引用得值 10 // 指针运算 int *p = n; printf("第二元素: %d\n", *(p+1)); // 输出 20 return 0; } ``` ### 关键特性 1. **不可修改性** 数组名是常量指针,不可重新赋值: ```c int a[5], b[5]; a = b; // 错误!数组名不是左值 ``` 2. **函数参数传递** 当数组作为函数参数时,实际传递的是首地址: ```c void func(int arr[]); // 等价于 void func(int *arr) ``` 3. **内存连续性** 数组元素在内存中连续存储,因此 `arr+1` 指向下一个元素[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值