C89:论数组/指针/引用
一.数组
1.整型数组
(1)一维数组
在一维数组中,数组名表示数组的第一个元素的地址
a[i] == *(a+i) // 在一维数组中,地址a进行加法 i 之后地址偏移,然后 *
1 2 3 4 5 6 7 8 9 10 11 12 | //一维数组 静态: 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]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //二维数组 静态: 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)多维数组
1 2 | int * array= new int [m][3][4]; delete [] array; |
2.字符数组
char[]表示字符数组
注意:数组名是一个不可修改的常量,不能对数组名进行赋值或者更改
1 2 3 4 5 6 7 8 9 10 11 | 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)一维数组传参
1 2 3 4 | //一维数组传参 void func( int * array); void func( int array[]); |
(2)二维数组传参
1 2 3 4 | //二维数组传参 void func( int ** array); void func( int (*array)[n]); |
二.指针
1.char*
char*表示字符指针
1 2 3 4 | char * p= "test" ; char * p={ "test" }; //由于p指针指向的是字符串常量,所以推荐这样写:const char* p="test"; |
3.智能指针
4.二维指针和三维指针
三.数组和指针
1.char*和char[]的相同
在传递函数参数的时候,字符数组和字符指针可以相互代替
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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)字符指针指向的字符串常量,不能变,字符数组名指向的内存区域可以变
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)