查看下面给出的代码:
#include<stdio.h>
int main()
{
int (*p)[3];
int a[3]={10,11,12};
p=&a;
printf("%d\n", *p[0]);
printf("%d\n", *p[1]);
printf("%d\n", *p[2]);
return 0;
}
printf(&#34;%d \ n&#34;,* p [0]);打印10是预期的。
但是printf(&#34;%d \ n&#34;,* p [1]);不打印11。
和 printf(&#34;%d \ n&#34;,* p [2]);不打印12.
为什么呢?这背后的原因是什么?
答案 0 :(得分:4)
运营商优先权。 []
的优先级高于*
,因此当您编写*p[0]
时,它与(*(*(p + 0)))
相同 - 您对数组指针执行指针运算。
这意味着,例如p[1]
为您提供了p
+ 3*sizeof(int)
个字节的地址,这些字节正在越过边界访问数组。
正确的代码应该是:
printf("%d\n", (*p)[0]);
printf("%d\n", (*p)[1]);
printf("%d\n", (*p)[2]);
答案 1 :(得分:2)
var textFileAsBlob = new Blob([data], {type: type}); //type is correct type (image/png, text/csv ...)
var fileNameToSaveAs = name + '.' + extension; //Name of a file and correct extension
var downloadLink = document.createElement("a");
为*p[k]
,而不是*(p[k])
。
您获得(*p)[k]
的预期结果可以通过它与*p[0]
相同来解释,并且将零置于哪个顺序并不重要。
p[0][0]
(p[1][0]
)与*p[1]
(p[0][1]
)不同。
(它甚至未定义,因为(*p)[1]
不存在。)
答案 2 :(得分:0)
int (*p)[3];
是指向int
的指针数组。
int a[3]={10,11,12};
是int
的数组。数组和指针共享很多属性。例如,您可以使用数组表示法作为指针。
让我们采用与int *p = a
相同的普通指针int *p = &a[0]
。现在指针指向数组的第一个元素。你可以像使用数组一样使用它。
printf("%d\n", p[0]); //10
printf("%d\n", p[1]); //11
printf("%d\n", p[2]); //12
你所做的是获取数组的地址 - &#34;指针&#34;这会产生数组第一个元素的地址。因为&a == a
这会写入指针数组的第一个元素,而不是
p[0] == a
p[1] == unknown
p[2] == unknown
通过执行*p[0]
,您获得了p(p[0]
)的第一个元素,并取消引用它*
。
这与*a
或a[0]
相同。
但是,通过执行*p[1]
,您将进入未知内存位置(p[1]
)并对其进行解除*
。这是未定义的行为。