static修饰
- 避免其它源文件使用该变量
- 保留该变量值,将其存储在静态区中(当该函数再次被调用的时候,该变量的值为上次函数调用结束时的值)
数组
全局数组会被默认初始化为\000,局部的则不会 数组在内存中是连续存放的,由低地址向高地址递增
二维数组
C
int arr[3][4];//创建
int arr[3][4] = {1,2,3,4,5,6,7,8}//可以自动分行初始化
int arr[3][4] = {{1,2},{3,4},{5,6}}//分行初始化二维数组声明行可以省略但列不可省略,也就是只能写成int a[][4]
二维数组的指针表示
C
int (*arr)[x]//指向一维数组的指针二维数组的内存存储
二维数组在内存中连续
行列数计算
C
int size = sizeof(arr)/sizeof(arr[0])//计算行数
int size = sizeof(arr[0])/sizeof(arr[0][0]);//计算列数指针表示
数组名可以表示首元素的地址
- 一维数组
C
&arr + 1//指向数组结尾处的下一个内存地址
arr + 1,&arr[0] + 1//指向第二项
arr,&ar[0]//指向第一项
int *arr,int arr[]//等价- 二维数组 详见
C
int arr[3][4];
arr//表示首元素地址,即第一行的地址
arr+1//第二行
&arr//整个二维数组的地址
&arr + 1//跳过整个二维数组
int size = sizeof(arr)/sizeof(arr[0])//计算行数
int size = sizeof(arr[0])/sizeof(arr[0][0]);//计算列数- sizeof(数组名),表示整合数组的大小,单位bit
- &取地址,表示整个数组,取出整个数组的地址
访问越界
数组越界访问不一定会报错,但会输出错误结果。应当通过计算size尽量避免越界。 二维数组越界可能会访问到自己的内存空间中从而输出数组的数据
访问
下标法
地址法
cpp
a[0] = {1,2,3};
*(a),*(a+1),*(a+2) ...相当于计算
指针移动访问
>[[C/指针]]
cpp
int a[0] = {1,2,3};
int *pt = a;
for(;pt<a+10;pt++){
printf(...);
}二维数组下标法的指针等价形式
cpp
int a[3][3] = {1,2,3,4,5,6,7,8,9};
cout << a[1][2] << endl;
cout << *(a[1] + 2) << endl;
cout << *(*(a+1) + 2) << endl;float
C
float a = 0.0f;//防止默认为double类型
int num[5] ;//必须为常量C99前数组大小必须为常量/常量表达式,C99之后可为变量以实现变长数组,变长数组不可以直接初始化
传参
数组传参传递的数组首元素的地址
C
void function(int a[])//指针变量内存空间
参见[[C/指针]]-sizeof
符号类型
无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的数据,因为有符号类型存在正负数 无符号类型的数存储范围比有符号类型大 >[[移位操作符]]
变量操作
- ++str:先自增后传参
- str++:先传参后自增
初始化
不完全初始化:未被赋值的数将被赋值为0
C
int num[5] = {1,2,3};- 不同的初始化方式 第一种末尾不含\0,第二种则包含
C
char str[] = {'a'};
char str[] = "a";