正在关注yesterday's question,我试了一些更多的指针。具体类型为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;
}
这里是它的输出:
p q
Original Pointers: 132021776 132021776
Incremented Pointers: 132021796 132021780
Pointer values: 132021776 1
指针
p
,通过跳跃20时递增。这是因为它是int(*)[5]
类型的指针,因此在数组中跳到sizeof(int) * number of columns
?两个
p
和q
使用与p
间接运算符时的值相同(但不同类型的),然而,我不会在数组的第一个单元格中获得的价值,而不是我得到的值p
本身打印出来。为什么是这样?当我使用int *p = &a
时,它引发了一个警告(由于不同类型的指针,但后来当我使用间接运算符与p,我可以得到它打印数组中的第一个单元格的值)。这是因为当我给你&a
到p
,其转换的&arr
的类型int *
类型(这是int (*) [5]
),然后分配给p
?
你的代码是未定义行为;你必须使用'%p'指定符打印地址,并将参数转换为'void *'。 –
注意:不要使用'%d'来打印指针,'int'对于指针来说可能太小(并且它在典型的64位系统上是*) –
对于简单的分配约束违规,gcc给出了很差的诊断。确保使用'gcc -std = c11 -pedantic-errors'进行编译,以使其正常运行。 – Lundin