我是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);
}
答案 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
参数并将找到的值作为函数结果返回会更简单,因为您似乎没有返回任何内容。
如果最后一点是您真正想要转换为指针的话,我很抱歉。