漫步IOS--数组、sizeof和函数形参

来源:互联网 发布:node forever 编辑:程序博客网 时间:2024/05/27 20:57
首先声明,该系列博客记录的重点是C、OBject-C(以后简称OC)相对于Java的不同,还有一些我在编码练习过程中遇到的问题还有解决方法,而并不是一份流水式的完全的学习笔记。还有一些内容是C和OC中特有的东西等。

 
一、数组
在C中数组的定义只有一种语法: 类型 名称[大小]  例如 : int Arr[10];没有第二种定义方法,对于他的赋值是和Java一样的。

二、SizeOf函数
在C中对于数组的大小,没有Java中的.size()方法,不能直接去获得一个数组中元素的数量。但是可以利用sizeof函数来求得。sizeof(Object)的功能是求得Object的长度。那么方法就来了,用数组整体的长度除以数组中单个元素的长度即可得数组中元素的个数。在代码中即是

int size = sizeof(sA)/sizeof(sA[0]);

另外,值得注意的是,在方法中对于形参数组长度的获取。在一个方法中对于通过形参传过来的数组进行sizeof的时候会报错,如下图。


意思就是说sizeof函数接收的参数并不是一个Object,而是接收到了一个地址。所以sizeof最后会返回地址int* 的长度而不是数组int[]的长度。虽然只是个警告不是个error,但是想想也知道,最后得到的结果也就不是正确的了。那么出现这种情况的原因是什么呢?因为在C语言中,函数中形参从调用处接收的实参,其实是接收的实参的地址,所以在这里sizeof直接去获取形参的长度会永远得到的只是一个地址,自然也就会出现上述的提示了。

三、函数形参
说到函数的形参,C语言中形参虽然接收后的值是地址,但是在方法中对形参进行赋值这个过程是单向的。即形参可以得到实参的数值,但是对于形参的赋值并不会反向传递回实参。这点和Java是有区别的。个人猜测C的处理机制应该是在为函数分配资源空间的时候也为形参分配了空间,并将实参的数值拷贝进去,然后将形参的地址记录下来供函数内的语句进行调用。至于是不是这么做的和这么做的原因为何有待探究。在以后有时间会想办法进行验证的。需要郑重一提的是数组形参。
void sort(int arr[],int size){    int re[size];    for (int i = 0; i < size; i++) {        for (int j = i+1; j < size; j++) {            if (arr[i] > arr[j]) {                arr[i] += arr[j];                arr[j] = arr[i] - arr[j];                arr[i] = arr[i] - arr[j];                re[i] = arr[i];            }        }    }}

调用的时候:
sort(arr1,5);
上面的是一个选择排序方法,下面的是一个调用。这时候你觉得数组arr1的值会被成功排序吗?答案是会的。这里要注意的是,在调用的时候,是把数组arr的地址作为参数传进方法内的,所以最后形参获得的数值也是和实参等值的arr的地址,再对其进行排序的时候,自然就是对arr的数据进行的直接操作了。所以这里的数组会被排序。
0 0
原创粉丝点击