c语言---数组

本文介绍了C语言中的数组,包括数组的初始化、使用方法,特别提到了二维数组的定义和访问方式。还对比分析了不同编译器对变长数组的支持情况,并讨论了结构体末尾的柔性数组。此外,文章还探讨了数组作为参数传递给函数的两种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串除了存放在字符型数组中,还能存放在文字常量区

数组

二维数组定义时,一维大小可缺省,但二维大小必须指明确定值;

错误使用实例:

char b[2][3]={“a”,“b”,“c”}; 错误,只有2行,却定义了3个字符串

数组的初始化

1.、直接给每个元素赋值
int array[4] = {1,2,3,4};
2、赋值一部分,后面缺省=0
int array[4] = {1,2};
3、不初始化
	1、如果不初始化,局部变量在栈上,各数组元素的值将是随机数;
	2、全局变量、静态变量处于数据区,默认初始化为0
int array[4] = {};
//未初始化的栈区:VS默认会报错;但如果关闭错误改为警告
//					则VS2015中编译器默认(在vs2017下)都按照cc去填充👉打印出来-858993460这个值即为0xcccccccc的十进制表示
					
3. 由赋值参数个数推测数组的个数
int array[] = {1,2};




int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };


1、声明时,使用 {0} 初始化;
2、使用memset;
3、用for循环赋值。

数组的使用:

访问二维数组b的第i行第j列的方式:

b[i][j]
*(b[i]+j)	==	*(*(b+i)+j)			这里*(b+i) ==  b[i]
(*(b+i))[j]			

比较分析

int array[3][4]*(array[i]+j)  ==  array[i][j]
*(array+i)     ==  array[i] 行地址
	
错误示例:	*(array+i*4+j)是第 ( 4*i+j ) 行的首元素地址
			列地址和行地址的偏移不能在一个级别上+

变长数组(C++支持,一般的C不支持)

int x = 2;   //x定义并赋值,当然不一定是2
char array[x];

测试了一下,这样的代码在VC6.0下会报错,因为对C99新标准没有很好地实现。VS2005也不行。VS2013可以正确编译。gcc 3.2.2也可以正确编译

结构体末尾的柔性数组

数组传递给函数的2种方法

c貌似不支持引用传递数组,而C++支持

调用函数的输入实参可以是指针or数组名

被调用函数接收数组传参的2种方式:
1、	地址传递
	void myFunction(int *param){}		形式参数是一个指针

2、	值传递(效率较低,不建议使用)
	void myFunction(int param[10]){}	形式参数是一个已定义大小的数组
	void myFunction(int param[]){}		形式参数是一个未定义大小的数组

故可以有2*2=4种传递方式
数组名传递给指针
数组名传递给数组名
指针传递给数组名
指针传递给指针

实例:

//数组的两种传递方式
#include<iostream>
using namespace std;
 
//值传递
//缺点:每次都要传递?个字节的数组长度的数组形参
void fun1(int a[5]){
    a[3] = 6;
}
 
//地址传递
//优点:每次只要传递4个字节长度的指针变量即可 
//缺点:数组的长度不好获取,在正常的开发中需要传入长度,当然也可以使用其他的方式获取
void fun2(int *a){
    a[3] = 6;
}
 
//主函数
int main(){
    int a[5] = {1,2,3,4,5};
    fun1(a);//值传递  方式1
    fun2(a);//地址传递  方式1
    fun1(&a[0]);//值传递  方式2
    fun2(&a[0]);//地址传递  方式2
    cout<<"a[3] = "<<a[3]<<endl;
    return 0;
}

另外,fun1(a)和fun1(&a[0])、fun2(a)和fun2(&a[0])都是等价的,a表示数组的首地址,&a[0]表示数组的第一个元素的地址,因而a==&a[0]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值