qsort(a,1000,sizeof(int)*2, comp);
int comp(const void*a, const void*b) {
return((int*)a)[0]-((int*)b)[0];
}
如上代码,现在我们有一个int a[1000][2];
用上面的comp函数可以实现对这个二维数组以a[i][0]的大小为依据从小到大排序。让我们来分析一下为什么。
首先comp的参数是指向数组元素的指针,至于是怎么判断这两个元素一个比基准元素大,一个比基准元素小,我们就不得而知了,然后调用comp方法,如果值为负则a指向的元素放在b指向元素的前面,如果值为正则相反。
既然是指向元素的指针那这里传的就是 &(a[i]),这是一个指向int数组类型的指针 int (* [2]),直观上a[i]是一个数组,所以&a[i]是一个指向数组的指针。逻辑上分析:a[i]=*(a+i) ,a本来是数组的名字,在这里退化成指向数组第一个元素的指针,也就是 int (*[2]) 指向int数组类型的指针,然后+i不影响类型,然后 * 运算之后得到一个int数组类型,本来他马上又要退化成指向第一个元素的指针也就是 int * int类型的指针 但是在两个地方数组名是不退化的,一个是sizeof运算,另一个就是&运算,所以对int数组取地址得到的结果是指向int数组的指针。
但他本来是一个指向int的指针,里面放着已经是他这个数组第一个元素的地址了,所以我们转为指向int的指针后面再加个[0]就行了。
这里面还涉及到一个我以前没注意到的知识点:
如果对一个指针&
操作或者*
操作之后任然是一个指针,那么得到的新变量里的值和旧变量里的值是一样的:
不然a[i][j]
就没法玩了(在a[i][j]
的a[i]
时候得到的int *
类型数据他的值就会变成5,然后再*(a[i]+j)
就会以5为地址),我以前居然没有注意到φ(* ̄0 ̄)