# C/C++语言备忘
## 一)数组
一维数组:
a[2]
二维数组:
a[2][3]
多维数组:
a[2][3][4]
字符数组:
char *pchar[] ={"abc","ef"}
## 二)指针
变量指针:
int *p
数组指针:
int (*p)[3]
函数指针:
int (*f)(int ,int)
一级指针、二级指针以及多级指针:
一级指针:指向普通变量的指针
二级指针:指向指针的指针,类似:
int ** p2
## 三)数组和指针
数组是连续储存数据的一种数据类型(线性储存),可以通过下标快速索引
指针直接储存各种类型变量的地址,可以通过指针修改变量值,但需要确保其合法性(不能为NULL)
int *a[3] ---- 指针数组,数组中存放的元素为指针
int (*a)[3] ---- 数组指针,该指针指向一个含3个int变量的一维数组
## 四)const修饰
1)int const * p;
2)const int *p;
3)int * const p;
4)int const * const p;
1)、2) 表示 指向常量的指针变量,不能通过指针修改值,但可以更改指针指向;
3)表示指向变量的常指针,不能更改指针的指向,但是可以通过指针修改变量的值;
4)表示指向常量的常指针,二者都不能修改
## 五)数组 /指针作为传参
当数组作为指针传参时,此时退化为指针,无法得知数组的长度,需要额外参数携带;
## 六)各表示含义
**一维数组:**
int a[3]
a - 数组首行首元素地址,一级指针
&a[0] - 数组首行首元素地址,一级指针,和上面一样
a[0] - 数组首个元素
a[1] - 数组第二个元素
&a - 整个数组的首地址,二级指针
&a :首行地址
*&a -> a:首行首元素地址
a+1 - 地址,跳4个字节
&a+1 - 地址,跳12个字节(整个数组占用空间)
sizeof(a) - 取的是整个数组长度12字节
sizeof(a[0]) - 取的是数组首元素大小,4字节
sizeof(&a) - 取的是一维数组整个数组的地址(首行地址),指针,占用大小和操作系统位数有关
————————————————
数组指针变量
int *p = a;
int *p = &a[0];
-上述表述一致,都是一级指针
int (*p)[3] = &a; --- 表示二级指针
或:
typedef int ARRARY[3];
ARRARY *p;
p=&a //p指向a数组,指向一维数组的指针
(*p)[i] //指针操作方式
//p=&a
//*p->*(&a)->a
//(*p)[i]->a[i]
或:
typedef int (*Q)[10];
Q p;
p=&a;
————————————————
**二维数组:**
int a[2][3]
a:二维数组首元素地址,代表首行地址,相当于一维数组整个的数组地址,相当于上面的一维的&a
*a:首行首元素地址,相当于一维数组首元素地址,相当于一维的a
a+i -> &a[i] :第i行地址
*(a+i)->*&a[i]->a[i]:第i行首元素地址
*(a+i)+j->a[i]+j->&a[i][j]:第i行第j列元素的地址
*(*(a+i)+j)->a[i][j]:第i行j列元素的值
sizeof(a): 二维数组整个数组长度
sizeof(a[0]): a[0]为第0行首元素地址,相当于测第0行一维数组的长度:4*3=12字节
sizeof(a[0][0]):a[0][0]为第0行第0列的元素长度:4个字节
数组指针
int (*p)[3];
int* p2;
p=&a //错误, x, 是整个二维数组的首地址, 不能直接给p,会报编译告警
p=a //ok, a是第0个一维数组整个数组的地址,无需加&; p++ 偏移量为一维数组长度
p2 = a[0]; /// p2++ 偏移量为单个元素长度
————————————————
指针相减:
(p+1)-p --- 是指的偏移量/指针指向变量大小 = 1,不是实际两个地址相减