我正在学习指南针:
int x[10];
int *p = &x这将使指向第一个元素的指针类型为int。所以,如果我有2D数组,我需要使用双指针:第一个指针将指向数组的第二个维度。这意味着:
int x[3][4] = {{1,2,3,4},{5,6,7,8},{9,9,9,9}};当我想指出它的时候,我必须声明像这样的第二维的大小,对吗?
int *p[4] = x;或者通过键入另一种方式:int **p;?
int *p[4]是整数指针数组,它接受4 * (sizeof(int*)),对吗?
发布于 2016-01-30 13:02:11
这将使指向第一个元素的指针类型(int)。
不是的。
&x是数组x的地址,是int (*)[10]类型的,您不能将它分配给int *类型。两者都是不兼容的类型。
所以,如果我有2D数组,我需要使用双指针:第一个指针将指向数组的第二个维度。
不是的。
在表达式中,数组转换为指向其第一个元素的指针,除非是sizeof和一元&运算符的操作数。因此,在这种情况下,转换后的x类型将是int (*)[4]。您需要一个指向4个int数组的指针,而不是一个4个指针数组。
int (*p)[4] = x;发布于 2016-01-30 13:05:59
添加,第一个示例是不正确的。
x是由10个ints组成的数组。p是一个指向int的指针,而不是一个指向10个int数组的指针。当分配给p时,x会衰减到指向int的类型指针。
转让应简单地:
int* p = x;发布于 2016-02-07 22:02:01
示例程序:
#include <stdio.h>
main(int argc, char* argv[])
{
int x[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 987, 9, 9 } };
int(*p)[4] = x; printf("p[2][1] %d", p[2][1]);
printf("\nsizeof(p) is : %d \nsizeof(*p) is : %d\n", sizeof(p), sizeof(*p));
}输出
p[2][1] 987
sizeof(p) is : 4
sizeof(*p) is : 16在我的系统中(和你的系统一样),int和指针是32位。指针的大小是4,int的大小也是4。
p首先是一个指针。不是数组。一个指针。它的尺寸是4的,不多了。,这就是你问题的答案,
现在,只为了添加一些有用的信息:
p是一个指向4个整数数组的指针。p指向的是4*4==16的大小。(在示例程序中,尝试将int更改为short,您将拥有sizeof(*p) is : 8)
我可以分配p=x,因为类型是正确的,现在p包含x和p的地址与x0相同。p[2][3]与x[2][3]和*(p[2]+3)相同。p[2]指向x的元素2,p[2]+3指向x[2]的元素3。(所有索引都基于0)
https://stackoverflow.com/questions/35102077
复制相似问题