一.数组
1.整型数组
(1)一维数组
在一维数组中,数组名表示数组的第一个元素的地址
a[i] == *(a+i) // 在一维数组中,地址a进行加法 i 之后地址偏移,然后 *
//一维数组
静态:int array[100];
静态:int array[100]={1,2}; //只初始化前两个元素
静态:int array[100]={0}; //全部置为零
动态:int* array=new int[100];
delete[] array;
动态:int* array=new int[100](1,2);
delete[] array;
(2)二维数组
在二维数组中,数组名表示 a[0] 的地址
a[1] == &a[1] [0] // 在二维数组中,a[1] 表示的是地址,而不是数组元素
a[i] + j == &a[i] [j] //在二维数组中,a[i] 表示的是地址,进行加法 j之后,也只是地址偏移,而不是数组元素
*(a+i) == a[i] // 在二维数组中,a[i]表示的是地址,所以 *( *(a+i) + j ) == *(a[i] + j) == a[i][j]
//二维数组
静态:int array[10][10];
静态:int array[10][10]={{1,1},{2,2}};
动态:int (*array)[n]=new int[m][n];
delete[] array;
动态:int** array=new int*[m];
for(i)
array[i]=new int[n];
for(i)
delete[] array[i];
delete[] array;
动态:int* array=new int[m][n];
delete[] array;
(3)多维数组
int* array=new int[m][3][4];
delete[] array;
2.字符数组
char[]表示字符数组
注意:数组名是一个不可修改的常量,不能对数组名进行赋值或者更改
char a[10]; //一维字符数组
char a[10][5]; //二维字符数组
char a[5]={'a','b'}; //多个字符赋值给字符数组
char a[]={'a','b'}; //多个字符赋值给字符数组
char a[5]={"abc"}; //字符串赋值给字符数组
char a[5]="abc"; //字符串赋值给字符数组
char a[]="abc"; //字符串赋值给字符数组
//注意:字符串总是以'\0'作为串的结束符,编译器已经在末尾自动添加了'\0'
3.数组传参
(1)一维数组传参
//一维数组传参
void func(int* array);
void func(int array[]);
(2)二维数组传参
//二维数组传参
void func(int** array);
void func(int (*array)[n]);
二.指针
1.char*
char*表示字符指针
char* p="test";
char* p={"test"};
//由于p指针指向的是字符串常量,所以推荐这样写:const char* p="test";
3.智能指针
4.二维指针和三维指针
三.数组和指针
1.char*和char[]的相同
在传递函数参数的时候,字符数组和字符指针可以相互代替
void Test(int* a){
char* a="abc"; //局部函数调用后,a指针变量指向的常量地址不会消失
char a[]="abc"; //局部函数调用后,a数组指向的内存会销毁
}
int main(){
int a[]="test";
int* p;
p=&a[0];
p=a+1;
Test(a);
}
2.char*和char[]的不同
(1)字符指针是变量,可以改变值,字符数组名是常量,不能变
(2)字符指针指向的字符串常量,不能变,字符数组名指向的内存区域可以变