为什么我不能在此指针处打印值?

Nat*_*thu 6 c arrays pointers

昨天的问题之后,我用指针进行了一些实验.特别是int(*)[n]类型的指针

这是我写的一些代码:

#include <stdio.h>

int main(void)
{
    int a[5] = {1, 2, 3, 4, 5};

    int (*p) [5] = &a;
    int *q = a;

    printf("\t\t\t\t\tp\t\tq\n\n");
    printf("Original Pointers: \t%20d%20d", p, q);
    printf("\n\n");
    printf("Incremented Pointers:\t%20d%20d", p+1, q+1);
    printf("\n\n");
    printf("Pointer values:         %20d%20d", *p, *q);
    printf("\n\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是它的输出:

                                    p                 q

Original Pointers:             132021776           132021776

Incremented Pointers:          132021796           132021780

Pointer values:                132021776                   1
Run Code Online (Sandbox Code Playgroud)
  • 指针p在递增时跳过20.这是因为它是一个类型的指针int(*)[5],因此sizeof(int) * number of columns在数组中跳转?

  • 二者pq使用与所述间接运算符时具有相同的值(但不同类型的),然而p,我并不在所述阵列的所述第一小区中获得的价值,而不是我得到的值p本身打印出来.为什么是这样?

  • 当我使用时int *p = &a,它会抛出一个警告(因为不同类型的指针,但后来当我使用p的间接运算符时,我可以让它打印数组中第一个单元格的值.这是因为当我指定时&ap,将其转换的类型&arr(这是int ( * ) [5])的类型int *,然后分配给p

小智 4

指针 p 在递增时跳跃 20。这是因为它是 int(*)[5] 类型的指针,因此按 sizeof(int) * 数组中的列数跳转?

是的。

p 和 q 具有相同的值(但类型不同),但是当对 p 使用间接运算符时,我没有得到数组第一个单元格的值,而是得到打印出来的 p 值。为什么是这样 ?

p指向一个数组,因此使用*p,您可以得到这个数组。在没有索引的情况下计算数组可以得到指向其第一个元素的指针。您在这里*p被评估为类型int *

附带说明一下,*通常称为解引用运算符。使用不同的术语可能会让其他人感到困惑。

当我使用 int *p = &a 时,它会抛出一个警告(因为指针类型不同,但后来当我对 p 使用间接运算符时,我可以让它打印数组中第一个单元格的值。是这是因为当我将 &a 分配给 p 时,它会将 &arr 的类型(即 int ( * ) [5])转换为 int * 类型,然后分配给 p ?

我在这里有一个答案,将其误读为类似int *q = (int *)p会创建别名指针和可能未定义行为的东西,因此在这里留下这个小提示,以防万一有人会明白这个想法。但你在这个问题中所建议的只是一个无效的作业。伦丁的回答对此有完整的解释。


您的代码中存在更多问题,您的指针打印应如下所示:

printf("Original Pointers: \t%20p%20p", (void *)p, (void *)q);
Run Code Online (Sandbox Code Playgroud)

指针可以大于int。需要强制转换void *是因为它printf()是一个可变参数函数。如果它被声明为采用 a void *,则转换将是隐式的,但由于事实并非如此,因此您必须自己进行转换。