如何用索引中的指针编写

时间:2013-10-02 22:44:17

标签: c arrays

我是c语言的新手。我想知道如何使用指针编写我的代码(带索引)。如果我理解正确,那么更改只需要"如果"并且在确定阵列时。我是对的吗?

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);
}

2 个答案:

答案 0 :(得分:1)

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

  

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

因此,在您的情况下,masivs[i][j]相当于*(*(masivs + i) + j)

我不能为我的生活想象为什么你会选择后者。

答案 1 :(得分: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参数并将找到的值作为函数结果返回会更简单,因为您似乎没有返回任何内容。

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