繁体   English   中英

指向2D数组的指针

[英]Pointer to a 2D array

我有一个2D数组( int s[4][2] ),并创建了一个指针为int (*p)[2]

现在为指针p分配了for循环内该行第1个元素的地址。

for (int i = 0; i<4; i++)
p = &s[i];

现在,当我尝试使用解引用编写数组元素数据时,我得到了错误的值。

printf ("%d \n", *p)

但是,如果我创建另一个指针并将其与以前的指针链接

int *ptr = p;

和取消引用指针ptr我得到正确的值。

printf ("%d \n", *ptr)

当两个指针都指向同一个地址时,为什么一个指针( *ptr )会按预期工作,而其他指针( *p )没有返回预期值?

如果p是指向数组的指针,则*p是2个ints( int[2] )的数组 因此,您不能打印这样的数组元素:

 printf ("%d \n", *p);

要通过指针p打印数组元素,您需要执行以下操作:

 printf ("%d \n", (*p)[0]); /* first element */
 printf ("%d \n", (*p)[1]); /* second element */

p不是指向int的指针。 它是一个指向两个int数组的指针。 因此, *p也是两个int的数组。 由于它不是int ,因此使用%d打印会产生不确定的行为。

由于类型不匹配,您将无法将ptr “链接”到pptr是指向int的指针,而p (已经指出)是指向两个int数组的指针。因此,分配ptr = p不会如果您要强制编译(例如ptr = (int *)p ),则ptrp将具有相同的值(即它们将标识内存中的相同位置),但类型不同(即,解引用它们将解释内容)内存的不同)。

p的值(忽略类型)将是s[0][0]的地址。 同样, ptr的值将是s[0][0]的地址。

结果printf("%d\\n", *ptr)将打印s[0][0]

当两个指针都指向同一个地址时,为什么一个指针(* ptr)会按预期工作,而其他(* p)却不返回预期值?

  • *p为一个int[2]数组。

    将数组int[2]传递给函数,结果是将数组的第一个元素int*传递给指针。

  • *ptr计算结果为int

    int传递给函数会导致将int传递给函数... :-)

通过

int (*ptr)[2] ; // means int[2]<-(*ptr)

您有一个指向两个整数的数组的指针

现在为指针p分配了for循环内该行第1个元素的地址。

这是不正确的,从技术上讲,p被分配了整个int[2]块的地址(提示:使用sizeof来验证大小)。

printf ("%d \\n", *ptr)

*ptr本身不包含整数,但它持有int[2]的第一个元素的地址,即*ptr本身是一个指针。

一个有效的例子是

int main(void)
{
int i;
int s[4][2]={{0,1},{2,3},{4,5},{6,7}};
int (*ptr)[2];
for(i=0;i<4;i++)
{
    ptr=&s[i];
    printf("i:%d\n",i);
    printf("Element 1 : %d\n",(*ptr)[0]);
    printf("Element 2 : %d\n",(*ptr)[1]);
    /* Replacing (*ptr)[1] with *((*ptr)+1) gives you the same
     * results
     */
}

return 0;
}

输出量

i:0
Element 1 : 0
Element 2 : 1
i:1
Element 1 : 2
Element 2 : 3
i:2
Element 1 : 4
Element 2 : 5
i:3
Element 1 : 6
Element 2 : 7

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM