C 我试图使用指针合并两个排序(int)数组,出于某种原因,它存储地址
所以我尝试使用带有函数“interclas”的指针将两个排序数组合并成一个新数组。我尝试使用相同的方法对函数中带有指针的数组进行排序,结果很好。正如您所看到的,它存储的是变量的地址,而不是变量本身。C 我试图使用指针合并两个排序(int)数组,出于某种原因,它存储地址,c,arrays,pointers,C,Arrays,Pointers,所以我尝试使用带有函数“interclas”的指针将两个排序数组合并成一个新数组。我尝试使用相同的方法对函数中带有指针的数组进行排序,结果很好。正如您所看到的,它存储的是变量的地址,而不是变量本身。 如果我运行它,它将存储数组的地址。我怎样才能解决这个问题?我仍然不熟悉方法主体中的指针,更改: void interclas(int *ptr,int *vec, int *c, int n) { int i,j,tmp; tmp=0; for (i=0;i++;i<n
如果我运行它,它将存储数组的地址。我怎样才能解决这个问题?我仍然不熟悉方法主体中的指针,更改:
void interclas(int *ptr,int *vec, int *c, int n) {
int i,j,tmp;
tmp=0;
for (i=0;i++;i<n)
for (j=0;i++;j<n)
{
if (vec[j]<=ptr[i])
c[tmp]=vec[j];
else
c[tmp]=ptr[i];
tmp++;
}
}
int main() {
int i,n;
int *ptr,*vec,*c;
printf("Nr. of elements of initial arrays : 5 \n");
n=5;
vec=(int*)malloc( n * sizeof(int));
ptr=(int*)malloc( n * sizeof(int));
c=(int*)malloc( 2 * n * sizeof(int));
for (i=0;i<n;i++) {
scanf("%d",&ptr[i]);
}
for (i=0;i<n;i++) {
scanf("%d",&vec[i]);
}
printf("\n");
printf("Initial arrays are : ");
for (i=0;i<n;i++) {
printf("%d ",ptr[i]);
}
printf("\n");
for (i=0;i<n;i++) {
printf("%d ",vec[i]);
}
interclas(ptr,vec,&c,n);
printf("Merged array is : ");
for (i=0;i<10;i++) {
printf("%d ",c[i]);
}
return 0;
}
为此:
for (i=0;i++;i<n)
for (j=0;i++;j<n)
interclas(ptr, vec, &c, n);
因为原型需要指向int的指针,所以对于第三个参数
方法的逻辑也有缺陷,请尝试放置一些printf,例如printfhere i=%d,j=%d,ptr[i]=%d,vec[j]=%d,tmp=%d\n,i,j,ptr[i],vec[j],tmp;要查看变量在迭代时的值,只需合并第一个数组的前两个元素
如果您仔细考虑一下,您想做的是遍历数组ptr和vec的第一个元素,并存储这两个元素中的最小值。如果现在min是数组ptr,那么您希望考虑ptr的下一个元素,否则将考虑vec的下一个元素
拿一支铅笔和一张纸,画出这个算法——你会看到它运行得很好,但是一些剩余的元素可能会被留下,而不会被插入到输出数组中
根据观察结果,在遍历数组并比较元素之后,如果需要,我们将在第一个数组上循环,以收集未访问的元素。第二个数组也是如此
编码思想会产生如下结果:
interclas(ptr, vec, c, n);
不是问题的根源,但不是。在方法的主体中,更改:
void interclas(int *ptr,int *vec, int *c, int n) {
int i,j,tmp;
tmp=0;
for (i=0;i++;i<n)
for (j=0;i++;j<n)
{
if (vec[j]<=ptr[i])
c[tmp]=vec[j];
else
c[tmp]=ptr[i];
tmp++;
}
}
int main() {
int i,n;
int *ptr,*vec,*c;
printf("Nr. of elements of initial arrays : 5 \n");
n=5;
vec=(int*)malloc( n * sizeof(int));
ptr=(int*)malloc( n * sizeof(int));
c=(int*)malloc( 2 * n * sizeof(int));
for (i=0;i<n;i++) {
scanf("%d",&ptr[i]);
}
for (i=0;i<n;i++) {
scanf("%d",&vec[i]);
}
printf("\n");
printf("Initial arrays are : ");
for (i=0;i<n;i++) {
printf("%d ",ptr[i]);
}
printf("\n");
for (i=0;i<n;i++) {
printf("%d ",vec[i]);
}
interclas(ptr,vec,&c,n);
printf("Merged array is : ");
for (i=0;i<10;i++) {
printf("%d ",c[i]);
}
return 0;
}
为此:
for (i=0;i++;i<n)
for (j=0;i++;j<n)
interclas(ptr, vec, &c, n);
因为原型需要指向int的指针,所以对于第三个参数
方法的逻辑也有缺陷,请尝试放置一些printf,例如printfhere i=%d,j=%d,ptr[i]=%d,vec[j]=%d,tmp=%d\n,i,j,ptr[i],vec[j],tmp;要查看变量在迭代时的值,只需合并第一个数组的前两个元素
如果您仔细考虑一下,您想做的是遍历数组ptr和vec的第一个元素,并存储这两个元素中的最小值。如果现在min是数组ptr,那么您希望考虑ptr的下一个元素,否则将考虑vec的下一个元素
拿一支铅笔和一张纸,画出这个算法——你会看到它运行得很好,但是一些剩余的元素可能会被留下,而不会被插入到输出数组中
根据观察结果,在遍历数组并比较元素之后,如果需要,我们将在第一个数组上循环,以收集未访问的元素。第二个数组也是如此
编码思想会产生如下结果:
interclas(ptr, vec, c, n);
不是问题的根源,但不是。&c是指向变量c的指针,它是指向指针的指针,类型为int**。你的编译器没有警告你把int**传递给一个需要int*作为参数的函数吗?在C语言中,你不必也不应该这样做。这是因为我的老师让我们用这种方式编写程序。我们可以在考试中得到它,所以我试着适应它@一些编程人员警告我,函数中的for循环是:对于j=0,语句无效[-wunused value];i++;j&c是指向变量c的指针,它是指向指针的指针,类型为int**。你的编译器没有警告你把int**传递给一个需要int*作为参数的函数吗?在C语言中,你不必也不应该这样做。这是因为我的老师让我们用这种方式编写程序。我们可以在考试中得到它,所以我试着适应它@一些编程人员警告我,函数中的for循环是:对于j=0,语句无效[-wunused value];i++;吉是这样做的。我不知道我怎么没看到它!现在它存储变量。虽然它只存储1和2,但对于ptr=12345和vec=34567,c=12122@manubmxnsb事实上,由于您的方法的逻辑存在缺陷,请检查我的更新答案,并让我知道您对此的看法!:它们是同义词,而i