数组:
声明方法:
1.datatype arr[]={0}; //个数由{}内元素个数决定
2.datatype arr[N]; //N必须大于0
3.datatype arr[N]={1,2,3}; //{}内个数不能超过N;若个数小于N,则未初始化的元素默认为0
4.datatype arr[5]={1,2,[4]=2,3,[1]=0}; //其元素为:1,0,0,2,3
5.若N为变量,则arr[N]为变长数组,声明时不允许初始化。
6.复合字面量:(datatype [N]){1,2,3}; //N可为空;复合字面量必须声明(创建)的同时使用它
数组的一种理解:一种数据类型——datatype []
多维数组:
声明方法:datatype arr[row_number][column_number]; //row_number可以为空,但是column_number必须填写
多维数组的一种理解(结合指针):
设 datatype arr[n][m],则arr[n][m]表示的数据类型为储存nxm个datatype数据的(二维)数组;arr[]表示的数据类型为储存n个arr[m]数据的数组。由此可视二维数组为“两层”:第一层储存datatype类型数组arr[],这一层面的指针操作为*(arr(首元素地址)+i),表示arr[i][];第二层储存datatype数据arr[][],这一层面的指针操作为*(*(arr+i)+j),表示arr[i][j]。
对应关系:arr——地址(m*datatype)
arr+i——地址(m*datatype)
*(arr+i)——地址(1*datatype)
*(arr+i)+j——地址(1*datatype)
*(*(arr+i)+j)——datatype数据
参考图片(来自C Primer Plus):(zippo为数组名)
数组和指针:
联系的关键:地址
??地址的“宽度”由数据类型决定。如int—4 bits。因此对地址进行操作运算,如+,-时,产生的数值变化是以其“宽度”为单位变化的。
1.数组名是数组首元素的地址 //arr=&arr[0]
2.指针的一种理解:一种数据类型——datatype * //设datatype *p,则p表示一个指向datatype类型的指针,对应的是地址;*p 则是对指针的解引用,对应的是datatype类型的数据;&p则表示指针自身的地址,与*p不同。
3.指针表示和数组表示:
一维数组:arr[i]==*(arr+i)
二维数组:arr[i][j]==*(*(arr+i)+j)
4.指针之间的赋值必须两者指向相同类型
5.指针操作:(基于运算符*和++优先级相同且结合律从右往左)
p++:指针指向下一个元素
*p++ == *(p++):指针指向下一个元素(下次引用时实现)
(*p)++:*p的值+1(下次实现)
++*p == ++(*p):*p的值+1(本次实现)
*++p:指针指向下一个元素(本次即实现)
指针数组和数组指针:
区别的原因:[]运算符的优先级高于*运算符
数组指针的声明:datatype (*p)[n]; //p是一个指向(储存n个datatype数据的数组)的指针
(操作:可向其赋值数组名,其他操作与指针&数组表示法一致
指针数组的声明:datatype *p[n]; //p是一个内含(n个datatype类型指针)的数组
函数形参:
指针形参和数组形参可以通用:datatype Function(datatype *arr/datatype arr[])
调用时传入数组名或指针:Function(arr)
??若要在该调用函数中改变主函数的变量,则须传入指针。
原文:https://www.cnblogs.com/ruanzy/p/12863474.html