【问题标题】:Using a swap function to swap the address in pointers of a 2D-array使用交换函数交换二维数组指针中的地址
【发布时间】:2018-03-25 12:52:35
【问题描述】:

对于一个任务,我需要为 n 个向量数组创建一个排序算法。该分配特别告诉我不要交换指针指向的值,而是存储在这些指针中的地址。然后将使用这些指针打印结果。

我的问题是我似乎无法完成指针包含的地址的交换。我已经搜索了相关问题,但它们几乎都改变了指针所指位置的值。

到目前为止,我有这个:

交换功能

void swap(double **p, double **q, int i, int j){

double* tmp;

tmp = &p;
*p= &q;
*q = tmp;
printf("\tSwapped [%d][%d] and [%d][%d]\n", i,j, (i-1), j);}

还有我的主要功能

int main (void){
int dim, num, *tmp;
int i, j, a;
double **w;
scanf("%d %d", &dim, &num);        /* read the dimension and amount of array*/                                                                  

w = calloc(num, sizeof(double *)); /* allocate array of num pointers */
for (i = 0; i<num; i++)
{
    /*allocate space for a dim-dimensional vector */
    w[i] = calloc(dim, sizeof(double));
    /* read the vector */
    for (j = 0; j < dim; j++)
    {
        scanf("%le", &w[i][j]);
    }
}

a = 0;
while (a <= num)
{
    /*sort num times*/
    i = (num -1);
    while(i != 0)
    {
        if ((argument1) > (argument2) )
        {   /*swap each columns of the rows individually*/
            printf("\tSwapping..\n");
            for(j = 0; j<dim; j++)
            {
                swap(&w[i][j], &w[i-1][j], i, j);
            }
        }
        i--;
    }
    a++;
}


for(i=0; i<num; i++)
{
    for(j=0; j<dim; j++)
    {
        printf("%e ",w[i][j]);
    }
    printf("\n");
}

return 0;

}

当我测试这个程序时,它确实正确地进入了交换功能,但打印结果与输入相同(所以没有交换)。谁能帮助我为什么这不起作用?

【问题讨论】:

  • 您是否忽略了编译中的警告?这些会很有帮助。我建议在编写自己的小程序时始终使用-Werror 进行编译。
  • 这很有帮助。结果我的交换参数发送了一个地址的地址(警告是“来自不兼容的指针类型的赋值”)。我还没到那里,但你帮了我很多。谢谢!
  • 太棒了——完全正确。当您开始时,最好立即获得良好的调试实践。如果您仍然卡住,您可以再次发表评论。

标签: c arrays pointers 2d swap


【解决方案1】:

swap 函数看起来像

void swap( double **p, double **q )
{
    double *tmp = *p;
    *p = *q;
    *q = tmp;
}

至于用于对数组进行排序的代码则无效且没有意义。至少没有声明变量argument1argument2

【讨论】:

  • 关于参数,在我的原始代码中有计算向量大小的函数。我用参数替换它们以使其更易于阅读。对于交换函数,您是否更改了指针指向的arraycel 的值?目标是更改指针指向的地址(这样不会更改任何值)。不过我可能看错了。
  • 你第一次是对的。现在有正确的代码。感谢您的帮助!
猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多