字符串除了存放在字符型数组中,还能存放在文字常量区
数组
二维数组定义时,一维大小可缺省,但二维大小必须指明确定值;
错误使用实例:
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]。