在昨天的问题之后,我用指针进行了一些实验.特别是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在数组中跳转?
二者p并q使用与所述间接运算符时具有相同的值(但不同类型的),然而p,我并不在所述阵列的所述第一小区中获得的价值,而不是我得到的值p本身打印出来.为什么是这样?
当我使用时int *p = &a,它会抛出一个警告(因为不同类型的指针,但后来当我使用p的间接运算符时,我可以让它打印数组中第一个单元格的值.这是因为当我指定时&a到p,将其转换的类型&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 *,则转换将是隐式的,但由于事实并非如此,因此您必须自己进行转换。