使用指针算术打印3D数组元素的指针

时间:2020-04-27 06:38:11

标签: c pointers multidimensional-array pointer-arithmetic

我正在测试如何使用带有指针算法的数组名称来访问数组元素,并且我想出了以下程序:

#include <stdio.h>

int main(){

    // definition of array using designators
    int a[2][2][2] = {
        [0] = {[0] = {1, 2}, [1] = {3, 4}},
        [1] = {[0] = {5, 6}, [1] = {7, 8}}
    };

    printf("7th  element (pointer):  %p\n", *(*(a + 1) + 1) + 0);
    printf("8th  element (pointer):  %p\n", *(*(a + 1) + 1) + 1);

    return 0;
}

尽管程序可以正常工作,并且可以正确打印所有内容:

7th  element (pointer):  0x7ffd4b09a1c8
8th  element (pointer):  0x7ffd4b09a1d0

我在编译时收到警告,对于在%p内使用printf()占位符的每一行都这样说:

warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int *’ [-Wformat=]
  printf("7th  element (pointer):  %p\n", *(*(a + 1) + 1) + 0);
                                   ~^     ~~~~~~~~~~~~~~~~~~~
                                   %ls

因此,乍一看,我似乎只需要将指针转换为(void *),如果我这样做并更改行即可:

printf("8th  element (pointer):  %p\n", *(*(a + 1) + 1) + 1);

此行:

printf("8th  element (pointer):  %p\n", (void *)(*(a + 1) + 1) + 1);

我收到警告:

warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
  printf("8th  element (pointer):  %p\n", (void *)(*(a + 1) + 1) + 1);
                                                             ^

并且编译器为第8个元素计算一个不同的地址,该地址仅比elemnet的地址大1个字节:

7th  element (pointer):  0x7ffd9e5e1bf8
8th  element (pointer):  0x7ffd9e5e1bf9

我也试图像这样修复它(增加了一个大括号)

printf("8th  element (pointer):  %p\n", (void *)((*(a + 1) + 1) + 1));

警告消失了,但地址的计算方式仍然不同:

7th  element (pointer):  0x7ffca6c6c468
8th  element (pointer):  0x7ffca6c6c470

看起来编译器需要指针类型来计算地址,如果我强制转换,它将不会核心地计算地址。有谁知道我该怎么做才能删除警告并以正确的方式计算地址?

2 个答案:

答案 0 :(得分:1)

如果您需要在int*上进行算术运算,并且将值视为void*,则在执行算术运算后将值强制转换为:< / p>

printf("7th  element (pointer):  %p\n", (void *)((int*)*(*(a + 1) + 1) + 0));
printf("8th  element (pointer):  %p\n", (void *)((int*)*(*(a + 1) + 1) + 1));

答案 1 :(得分:0)

您可以将指针存储到一个单独的变量中,并将其传递给printf:

void *ptr7th = (*(*(a + 1) + 1) + 0);
void *ptr8th = (*(*(a + 1) + 1) + 1);
printf("7th  element (pointer):  %p\n", ptr7th);
printf("8th  element (pointer):  %p\n", ptr8th);

将gcc版本9.3.0与-Wall参数一起使用不会返回任何警告。

相关问题