在没有[]和()运算符的情况下在C中打印出一个数组 - 如何?

时间:2013-12-08 21:24:36

标签: c arrays pointers

我写了这样的代码,但它只显示了这个:

2
2
2
2
2
2 

...

那不是我想要的输出。

下面是代码:

void fun(int *tab, int n)
{
    int i, wsk = &tab;
    for(i=0; i<n; i++)
    {
        printf("%d\n", *(tab+1));
    }
}

int main(int argc, char **argv)
{
    int tab[] = {1,2,3,4,5,6};
    fun(tab, 6);

    return 0;
}

我试过的第二个版本根本不起作用:

void fun(int *tab, int n)
{
    int i, wsk = &tab;
    for(i=0; i<n; i++)
    {
        printf("%d\n", *(wsk+i));
    }
}

int main(int argc, char **argv)
{
    int tab[] = {1,2,3,4,5,6};
    fun(tab, 6);

    return 0;
}

Code :: Blocks说:

|49|error: invalid type argument of unary ‘*’ (have ‘int’)|

4 个答案:

答案 0 :(得分:4)

没有分组括号,也没有下标。没有杂乱:

void fun(int *tab, int n)
{
    while (n--)
        printf("%d\n", *tab++);
}

答案 1 :(得分:3)

更改

printf("%d\n", *(tab+1));

printf("%d\n", *(tab+i));

在两个计划中:

int i, wsk = &tab;

应该是:

int i, *wsk = tab;

编辑: OP实际上在标题without [] and () operators中也有此约束。 虽然通常引用转换运算符的()运算符,但函数调用的()在C标准中也称为函数调用运算符,并列出标准中的后缀运算符。因此我认为这个OP约束是错误的,因为没有函数调用我怀疑OP问题是否有任何有效的答案。

答案 2 :(得分:3)

  

...没有[]和()运算符

那应该是这样的:

void fun(const int * tab, const size_t n)
{
  const int * wsk = tab;
  size_t i = 0;
  for(; i < n; ++i, ++wsk)
  {
      printf("%d\n", *wsk);
  }
}

答案 3 :(得分:1)

您想要打印指向的标签,因此请勿使用&amp; tab

for(i=0; i<n; i++)
{
    printf("%d\n", *(tab+i));
}

在你的第一个版本中,你总是打印第二个元素,*(tab + 1)基本上是 “什么标签指向+1”,这是第二个元素 你想要的是选项卡指向+每个迭代增加1的计数器,这是你的i:)

编辑: 对不起没注意到你也不想要()。 *标签++