我认为如果我创建一个指向数组类型的指针,我将能够打印它的所有元素。我写了一个像这样的程序,
#include <stdio.h>
int main()
{
int arr[] = {4,2,3};
//here arr is a (*arr)[3] type
int (*p)[3], i;
p = &arr;
for(i = 0 ; i < 3 ; i++)
printf("%d ", *(p)[i]);
printf("\n");
return 0;
}
输出:4 0 -673566907
我的理解是p将指向3个元素的数组。 p + 1将指向另一个包含3个元素的数组。
arr=x [ 1 2 3 ]
y [x] [x+1] [x+2]
p=y(address of arr)
*p=x
**p = 1
*(*p+1) = 2
*(*p+2) = 3
我可以像上面那样打印数组。这是否意味着p实际上是双指针?
P.S 这是正确的阅读方式吗
*(p)[1]应该被理解为&#34; p是1指针的数组&#34;
(* p)[1]应该被理解为&#34; p是指向1个元素的数组的指针&#34;
当我们打印
printf("%d ", (*p)[1]); //here it should be read as p is a pointer to the
第二个元素&#34;
答案 0 :(得分:2)
您错误地在p
语句中取消引用指针printf
。您的代码就好像p
是一个指向int的指针数组而不是指向int数组的指针。而不是
printf("%d ", *(p)[i])
你想要
printf("%d ", (*p)[i])
因为你必须首先将p
转换为int [3],然后将其编入索引。
答案 1 :(得分:1)
更改行
printf("%d ", *(p)[i]);
到
printf("%d ", (*p)[i]);
由于引用(*p)
,它将首先访问指向数组的指针,然后使用[]
- 运算符遍历数组的内容。
考虑代码中for循环的第二次迭代,它等于:
printf("%d ", *(p + 1));
尝试使用p+1
访问内存位置*
会导致未定义的行为,正如其他人已经指出的那样。
答案 2 :(得分:0)
不,对于i
for(i = 0 ; i < 3 ; i++)
printf("%d ", *(p)[i]);
在您尝试访问无效内存时导致undefined behavior。
因此,p
不是指向指针的范围,它是一个指向数组的指针,正如他们所说,数组不是指针和副指针-versa。
但是,您可以指向数组的开头,然后循环直到数组中有有效元素,这是允许的。
答案 3 :(得分:0)
我将从这个帖子中发表我的理解,
指向数组类型的指针
int arr[4] = {2,4,1,7};
int (*p)[4];//here p is a pointer, pointing to an array of 4 elements
p = &arr;
现在如果我想访问第0个数组的元素
*p = *(p+0); //first element address pointed by p
*p+1 = *(p+0)+1;//second element addres pointed by p
等等
现在
**p = *(*(p+0)) ;//dreference of the 0th element of 0th array. equals to (*p)[0] expression.
*(*p+1) = *((*p+0)+1);//dereference of the 1st element of 0th array. equals to (*p)[1] expression
*(p)[1] = *(p+0)[1] =*(p+(1))= *(p+1) = next array.
答案 4 :(得分:0)
我不太了解您的代码,但我以这种方式编辑它并且它有效。希望它可以帮助你。
CATransform3DRotate