[英]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
“链接”到p
( ptr
是指向int
的指针,而p
(已经指出)是指向两个int
数组的指针。因此,分配ptr = p
不会如果您要强制编译(例如ptr = (int *)p
),则ptr
和p
将具有相同的值(即它们将标识内存中的相同位置),但类型不同(即,解引用它们将解释内容)内存的不同)。
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.