吐槽
作为java开发者的我用c还是有很多不习惯的,遇到很多问题,解决起来真心累,而且我这是安卓转jni转c,一层一层的调试出问题可真心累啊,
直接用sizeof是没法测量出长度的,需要除以其中一个元素的长度才能得到真实的长度,但是作为形参传递又没法测量了,下面是一系列举例和解决办法。
如果数组不作为参数传递,那么取长度的代码是:
int ints []= int ints []={
1800,2196,2244,2236,1988,
2264,2204,2240,2196,2204,
2240,2264,1988,2236,2236,
1988,2248,2232,2268,2212,
2220,2240,1988,2260,2220
,2212,2216,2264,1988,2232,
2288,2196,2244,2200,2204,
1988,2196};
int firstArrLength=sizeof ints[0];
int measureLength=sizeof ints;
int length=sizeof ints/firstArrLength ;
//一个元素的大小 就是类似ints[0]
printf("真实 arr length:%d, 测量长度 %d,first arr length:%d ",length,measureLength,firstArrLength);
printf("test function:%d ",arrActualLength(ints));//37个元素
上面代码中,length变量为实际元素长度,
如果作为参数传递,那么此方法行不通了。
第二种方法 有点影响执行效率,越长就效率越低
int classSign []={1800,2196,2244,2236,1988,2264,2204,2240,2196,2204,2240,2264,1988,2236,2236,1988,2248,2232,2268,2212,2220,2240,1988,2260,2220,2212,2216,2264,1988,2232,2288,2196,2244,2200,2204,1988,2196,-1};
/**
* 返回实际上数组个数 需要给最后一个元素做一个标记为 -1
* @param arr
* @return
*/
static int intArrActualLength(int arr[]) {
//作为形参传递 这样依然没法测量实际的长度
/* int firstArrLength = sizeof arr[0];
int measureLength=sizeof arr;
int length = sizeof arr / firstArrLength;
return length;
*/
int *p;
p=arr;
int num=0;
while((*p)!=-1)
{
++num;
p++;
}
return num;
}
对于字符串的数组同样可以用此种方法,比如最后一个元素声明为NULL
学习生涯
对于java开发者的我不可能系统的去学习c语言,因为我还有很多很多事情要做,而且有些东西没有用到很快就会遗忘,如果不忘记的话,我会考虑花时间系统的学习。