一.数组
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"; //字符串赋值给字符数组 //注意:字符串总是以' '作为串的结束符,编译器已经在末尾自动添加了' '
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)字符指针指向的字符串常量,不能变,字符数组名指向的内存区域可以变