Bootstrap

根据指定的值删除函数数组的元素,并返回数组新长度

给出指定:数组:int nums[]={3, 16, 21, 16, 9, 13, 16, 16, 29, 16};

指定删除的值:int delNum = 16;

 给出函数:void delAppointNum(int *array,int length,int delNum,int *newLength)

补全完整。
以下是完整代码:

#include <stdio.h>

/*根据指定的值删除函数数组的元素,并返回数组新长度*/
void delAppointNum(int *array,int length,int delNum,int *newLength)
{   int new = 0;
    for(int i = 0;i <length;i++)
    {
        if(array[i] == delNum)
        {
            new++;
        }
        else
            printf("%d ",array[i]);
    }
    *newLength  = new;
}

int main()
{
    int nums[]={3, 16, 21, 16, 9, 13, 16, 16, 29, 16};
    int delNum = 16;
    int len = 0;
    int length1 = sizeof(nums)/sizeof(nums[0]);
    delAppointNum(nums,length1,delNum,&len);
    printf("\nlen is %d\n",len);
    return 0;
}

再说说,我在过程中所遇到的问题。

#include <stdio.h>
/*根据指定的值删除函数数组的元素,并返回数组新长度*/
void delAppointNum(int *array,int length,int delNum,int *newLength)
{ 
    for(int i = 0;i <length;i++)
    {
        if(array[i] == delNum)
        {
            *newLength++;
        }
        else
            printf("%d ",array[i]);
           
    }
}
int main()
{
    int nums[]={3, 16, 21, 16, 9, 13, 16, 16, 29, 16};
    int delNum = 16;
    int len = 0;
    int length1 = sizeof(nums)/sizeof(nums[0]);
    delAppointNum(nums,length1,delNum,&len);
    printf("\nlen is %d\n",len);
    return 0;
}

首先,这是我一开始的代码:当时想着 *newLength = len,那我直接*newLength++,然后返回值就ok了,但是运行了一下,发现不对,结果为0。我就出现混乱了,想着*newLength不是地址,而是一个值(初学指针数组的痛苦)。然后我想着用++后的地址减去原本的地址,得出来的值是不是就是它的长度。便有了以下代码:

#include <stdio.h>
/*根据指定的值删除函数数组的元素,并返回数组新长度*/
void delAppointNum(int *array,int length,int delNum,int *newLength)
{ 
    for(int i = 0;i <length;i++)
    {
        if(array[i] == delNum)
        {
            *newLength++;
        }
        else
            printf("%d ",array[i]);
           
    }
}
int main()
{
    int nums[]={3, 16, 21, 16, 9, 13, 16, 16, 29, 16};
    int delNum = 16;
    int len = 0;
    int *len1 = &len;
    int length1 = sizeof(nums)/sizeof(nums[0]);
    delAppointNum(nums,length1,delNum,&len);
    len = &len - len1;
    printf("\nlen is %d\n",len);
    return 0;
}

发现结果为0,想着根据地址操作无法实现。(初学者还不懂地址怎么使用)。然后就去查找解决办法。然后发现这张图,犹如醍醐灌顶:

(*newLength)++  和   *newLength++ 并不相同,前者是所指向内容+1,后者是地址+1。如下面代码所示:

#include <stdio.h>
int main()
{
    int num = 10;
    int *p = &num;

    printf("%p\n",&num);
    printf("%d\n",num);
    printf("%d\n",*p);

    *p++;
    printf("%d\n",*p);
    printf("%p\n",p);

    return 0;
}

#include <stdio.h>
int main()
{
    int num = 10;
    int *p = &num;

    printf("%p\n",&num);
    printf("%d\n",num);
    printf("%d\n",*p);

    (*p)++;
    printf("%d\n",*p);
    printf("%p\n",p);
    
    

    return 0;
}

从以上两个结果图对比可得:

*p++对p所指向的空间地址进行+1(int *类型+4字节,char *类型+1字节等等),空间地址改变,空间地址所对应的内容也会改变。

(*p)++只对p所指向的空间地址的值进行+1,而地址不会改变。

根据以上,修改后完整代码如下:

#include <stdio.h>
/*根据指定的值删除函数数组的元素,并返回数组新长度*/
void delAppointNum(int *array,int length,int delNum,int *newLength)
{ 
    for(int i = 0;i <length;i++)
    {
        if(array[i] == delNum)
        {
            (*newLength)++;
        }
        else
            printf("%d ",array[i]);
           
    }
    
}

int main()
{
    int nums[]={3, 16, 21, 16, 9, 13, 16, 16, 29, 16};
    int delNum = 16;
    int len = 0;
    //printf("%p\n",&len);
    int length1 = sizeof(nums)/sizeof(nums[0]);
    delAppointNum(nums,length1,delNum,&len);;
    printf("\nlen is %d\n",len);
    
    return 0;
}

;