-3

我是 C 语言的新手。我想知道如何用指针编写我的代码(带有索引)。如果我理解正确,那么仅在“if”和确定数组时才需要更改。我对吗?

int poz_ind(int masivs[row][col], int r, int c,int rinda)
{
    rinda=-1;
    int i,j;


    for(i=0; i<r; i++)
    {
        fail=0;

        for(j=0; j<c; j++)
        {
            if(masivs[i][j]<=0)
            {
                fail=1;
                break;
            }
        }

        if(fail==0)
        {
            rinda=(i);
            break;
        }
    }

    if (rinda>-1)
    {
        rinda++;
    }
    else
    {
        rinda=0 ;
    }

    printf("Pirma rinda ar tikai pozitiviem elementiem ir rinda Nr:  %d\n",rinda);
}
4

2 回答 2

1

我不会重写整个事情,但转换为指针的原因是优化器不这样做时的速度。最简单的方法遵循矩阵的行结构。只有内部循环对“指针化”有意义,但如果 2D 示例对某人有帮助,我会同时做这两个:

int[col] *prow, *plastrow; /* current row and (last+1) row pointers */
int rinda = -1;            /* row number with first negative entry */

for (prow=masivs, plastrow=prow+r; prow<plastrow; ++prow)
{
    int *pval, *plast;
    int fail = 0;
    for (pval = *prow, plast=pval+c; pval<plast; ++pval)
    {
        fail = (*prow < 0);
        if (fail) break;
    }
    if (!fail)
    {
        rinda = prow - masivs;
        break;
    }
}

现在你得到了你想要的结果:rinda如果每一行都有一个负条目,则为 -1,或者找到没有负条目的第一行的索引。你之后添加一个,但我会把它留给你。

不太简单的方法涉及将数组视为单个 int[row*col] 数组,然后再考虑我不会深入讨论,因为它真的只有使用 r==row 和 c==col 才有用。

您还有另一个需要注意的问题。您将参数变量rinda用作局部变量,看起来您打算将该值返回给调用者。C 按值传递非数组数据,因此名称rinda指的是调用者参数值的副本,该副本将在函数返回后立即丢弃。使用参数返回结果需要更正常地使用指针。尝试:

int poz_ind(int masivs[row][col], int r, int c,int *prinda)
{
     int  rinda = -1; /* as in the above snippet */

...最后,当您计算出 rinda 的最终正确值时:

    *prinda = rinda;

该调用将需要调用poz_ind(masivs, r, c, &rinda)以获取存储在调用者变量命名的值rinda。完全删除rinda参数并将找到的值作为函数结果返回会更简单,因为您似乎没有返回任何内容。

如果这最后一点是您真正想要转换为指针的内容,我很抱歉。

于 2013-10-03T00:00:47.990 回答
1

a[b]与 相同*(a + b)。从C11,6.5.2.1 数组下标,第 2 段:

下标运算符的[]定义E1[E2](*((E1)+(E2)))

所以在你的情况下,masivs[i][j]相当于*(*(masivs + i) + j).

不过,我无法想象你为什么会选择后者。

于 2013-10-02T22:46:41.240 回答