指向数组类型混乱的指针

时间:2017-03-23 11:10:05

标签: c arrays pointers pointer-to-pointer

我认为如果我创建一个指向数组类型的指针,我将能够打印它的所有元素。我写了一个像这样的程序,

#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 这是正确的阅读方式吗

  1. *(p)[1]应该被理解为&#34; p是1指针的数组&#34;

  2. (* p)[1]应该被理解为&#34; p是指向1个元素的数组的指针&#34;

  3. 当我们打印

  4. printf("%d ", (*p)[1]); //here it should be read as p is a pointer to the第二个元素&#34;

5 个答案:

答案 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

的0以外的任何值
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