Skip to content

static修饰

  1. 避免其它源文件使用该变量
  2. 保留该变量值,将其存储在静态区中(当该函数再次被调用的时候,该变量的值为上次函数调用结束时的值)

数组

全局数组会被默认初始化为\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]);//计算列数
  1. sizeof(数组名),表示整合数组的大小,单位bit
  2. &取地址,表示整个数组,取出整个数组的地址

访问越界

数组越界访问不一定会报错,但会输出错误结果。应当通过计算size尽量避免越界。 二维数组越界可能会访问到自己的内存空间中从而输出数组的数据

访问

下标法

地址法

cpp
a[0] = {1,2,3};
*(a),*(a+1),*(a+2) ...

相当于计算a+isizeof(int),与下标访问相同

指针移动访问

>[[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";