带指针到数组的指针算术

时间:2015-05-12 21:52:00

标签: c arrays pointers

我正在尝试使用指向数组的指针进行指针运算,但由于无法正确取消引用指针,因此得到错误的值。 这是代码:

  #include "stdlib.h"
  #include "stdio.h"

  int main()
  {
  int a[] = {10, 12, 34};

  for (int i = 0; i < 3; ++i)
  {
      printf("%d", a[i]);
  }
  printf("\n");

  int (*b)[3] = &a;
  for (int i = 0; i < 3; ++i)
  {
      printf("%d", *(b++));
  }
 printf("\n");

  return 0;
  }

在第二个中,我无法打印正确的值。

即使我写

也不行
printf("%d", *b[i]);

我想看看如何使用b ++和b [i]语法正确打印。

3 个答案:

答案 0 :(得分:1)

您已将b声明为指向3个整数数组的指针,并使用a的地址初始化它。

int (*b)[3] = &a;

在第一个循环中,您将打印a数组的第一个元素,但随后您将移动3*sizeof(int)并触发未定义的行为,尝试打印任何内容。

要正确打印:

int *b = a;
// int *b = &a[0];    // same thing
// int *b = (int*)&a; // same thing, &a[0] and &a both points to same address,
                      // though they are of different types: int* and int(*)[3]
                      // ...so incrementing they directly would be incorrect,
                      // but we take addresses as int* 
for (int i = 0; i < 3; ++i)
{
    printf("%d", (*b++));
}

答案 1 :(得分:1)

以下内容应该有效:

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

// * b + i将为您提供从第一个元素a [0]的地址开始的每个连续地址 //外部&#39; *&#39;会给你那个位置的价值。

而不是:

printf("%d", *(b++));

答案 2 :(得分:0)

gcc会抱怨第二个for循环中的格式:它会告诉你format specifies type 'int' but the argument has type 'int *

你对a到b的分配应如下所示:

int *b = a