以题目为例深入理解指针

本题要点:

1:要通过一个函数改变一个数的值,就必须用一个指针,这意味要改变一个数组的值,就必须用一个二级指针。

2:认识c语言的qsort函数:【C语言】快速排序函数qsort()_zhangshuo的博客-CSDN博客_qsort函数c语言

3:对指针有更深入的认识。

int inc(const void *a, const void *b)
{
    return *(int*)a - *(int*)b;
 }//快排的一个步骤,暂时还不理解为什么这样做
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
int i,j,k;
int **ans;
int spa=4;
*returnSize=0;//这个返回共有多少个组,一开始把它设为0;
ans=(int**)malloc(sizeof(int*)*spa);//给答案的一维数组开辟一个空间,先开辟一个小的空间,不够再加
*returnColumnSizes=(int*)malloc(sizeof(int)*spa);//ColumnSizes其实是一个一维数组,但是我们要改变它的值,所以设为了二维数组才能改变,但我们本质上要改变的还是一维数组,所以要加一个*
qsort(nums,numsSize,sizeof(int),inc);///<stdlib.h>里面的快速排序;
for(i=0;i<numsSize-2;i++){//设置一个定点,然后后面两个指针向中间靠
j=i+1;
k=numsSize-1;//初始化
 if (i> 0 && nums[i] == nums[i - 1]) continue;//因为题目说了不能出现相同的一组,所以遇到相同的一定要跳过
while(j<k){
    if(nums[i]+nums[j]+nums[k]==0){
        ans[*returnSize]=(int*)malloc(sizeof(int)*3);//继续开辟空间,二级指针要开两个空间
        ans[*returnSize][0]=nums[i];
ans[*returnSize][1]=nums[j];
ans[*returnSize][2]=nums[k];
(*returnColumnSizes)[*returnSize]=3;//因为每次固定是三个数,所以直接让它等于3
(*returnSize)++;
while(j<k&&nums[j]==nums[j+1])//检查是否会和后一个数相同,直到下个数不同位置,就变到下一个数之前的一个数
j++;
k--;//满足等于0的情况,两边指针都要动,还挺容易理解的
j++;
if(*returnSize==spa){
    spa*=2;
ans=(int**)realloc(ans,sizeof(int*)*spa);
*returnColumnSizes=(int*)realloc((*returnColumnSizes),sizeof(int)*spa);
}//当空间不够就扩容,注意使用realloc函数,当指针一直在移动话就应该用malloc,暂时还没遇到那种题
    }
   else if(nums[i]+nums[j]+nums[k]>0)//其他情况了,这个好理解
    k--;
    else
    j++;
}
}
return ans;
}

不断更改空间的值,用时和内存都不断在变化,而且变化还挺大的。

这个题花了几乎一天来完成 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值