给出指定:数组: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 = #
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 = #
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;
}