指向数组的指针问题:如果 int (*p)[4] = m;表示的是什么意思? 如果Int *p = &m[0][0];int *p = m[0];
intm[2][4]={{01,02,03,04},{3,2,5,7}};如果int(*p)[4]=m;表示的是什么意思?如果Int*p=&m[0][0];int*p=m...
int m[2][4]={
{01,02,03,04},
{3,2,5,7}
};
如果 int (*p)[4] = m;表示的是什么意思?
如果Int *p = &m[0][0];int *p = m[0];是什么意思?
这些表达示有什么区别或是联系。
int m[2][4]; int (*p)[3]=m和int *(p)[4]=m有什么区别,好像测试是没什么区别的 展开
{01,02,03,04},
{3,2,5,7}
};
如果 int (*p)[4] = m;表示的是什么意思?
如果Int *p = &m[0][0];int *p = m[0];是什么意思?
这些表达示有什么区别或是联系。
int m[2][4]; int (*p)[3]=m和int *(p)[4]=m有什么区别,好像测试是没什么区别的 展开
2个回答
展开全部
额,一楼说得有些不对.
m是个二维数组,由两个一维数组m[0]和m[1]组成.
对于int (*p)[4] = m:
int (*p)[4]这声明解析出来就是: p是个指针,指向一个数组,这数组有4个元素,该元素为int.
简洁点说就是p为指向有4个int类型元素的数组, 即p为数组指针.
而数组名即指针,m也可以说是指向有4个int类型元素的数组,即m和p是同类指针,所以可以进行赋值.
再具体点说, m是指向m[0]这个一维数组的,所以"int (*p)[4] = m;"执行后,p也就指向了m[0]了,此时,*p,p[0],m[0],*m这4个是等价的; (*p)[0],p[0][0],(*m)[0],m[0][0]这4个是等价的.
对于int *p = &m[0][0]:
地址即指针,指针即地址,所以"&m[0][0]"是个指向int型的指针.
数组是线性存储的,即m这个二维数组,从其第一个元素到最后一个元素的内存地址,是按sizeof(int)进行逐级递增的,所以执行"int *p = &m[0][0];"后,p指向了m这个二维数组的第一个元素,则有下列等价关系: p[n]=m[n/4][n%4];(0<=n<=7),如p[7]和m[1][3]是等价的.(不要说p[7]这样表达已经越界,是不合法的."[]"是数组运算符,p[7]会被编译器解释为*(p+7),而p+7明显是指向m这个二维数组的第7个元素,并没有指向数组外的内存,所以是合法的)
对于int *p = m[0]:
这个和第二种情况一样,因为m[0]是指针,其指向m[0][0].而"&m[0][0]"也是指针,也指向m[0][0],所以这两个指针完全等价.
m是个二维数组,由两个一维数组m[0]和m[1]组成.
对于int (*p)[4] = m:
int (*p)[4]这声明解析出来就是: p是个指针,指向一个数组,这数组有4个元素,该元素为int.
简洁点说就是p为指向有4个int类型元素的数组, 即p为数组指针.
而数组名即指针,m也可以说是指向有4个int类型元素的数组,即m和p是同类指针,所以可以进行赋值.
再具体点说, m是指向m[0]这个一维数组的,所以"int (*p)[4] = m;"执行后,p也就指向了m[0]了,此时,*p,p[0],m[0],*m这4个是等价的; (*p)[0],p[0][0],(*m)[0],m[0][0]这4个是等价的.
对于int *p = &m[0][0]:
地址即指针,指针即地址,所以"&m[0][0]"是个指向int型的指针.
数组是线性存储的,即m这个二维数组,从其第一个元素到最后一个元素的内存地址,是按sizeof(int)进行逐级递增的,所以执行"int *p = &m[0][0];"后,p指向了m这个二维数组的第一个元素,则有下列等价关系: p[n]=m[n/4][n%4];(0<=n<=7),如p[7]和m[1][3]是等价的.(不要说p[7]这样表达已经越界,是不合法的."[]"是数组运算符,p[7]会被编译器解释为*(p+7),而p+7明显是指向m这个二维数组的第7个元素,并没有指向数组外的内存,所以是合法的)
对于int *p = m[0]:
这个和第二种情况一样,因为m[0]是指针,其指向m[0][0].而"&m[0][0]"也是指针,也指向m[0][0],所以这两个指针完全等价.
追问
还有一个不懂的,int m[2][4]; int (*p)[3]=m和int *(p)[4]=m有什么区别,好像测试是没什么区别的,求解释,谢了
追答
看下面这程序咯:
#include
int main(void){
int m[2][4] = {0, 1, 2, 3, 4, 5, 6, 7};
int (*p)[3] = m;
int (*q)[4] = m;
printf("p[1][0]=%d, q[1][0]=%d\n", p[1][0], q[1][0]);
return 0;
}
运行后输出:
p[1][0]=3, q[1][0]=4
上面这程序中,p是指向有三个int型数组的指针,q是指向有4个int型数组的指针
而p[1][0] = *(*(p+1)+0),q[1][0]=*(*(q+1)+0), 这两者区别在于p+1与q+1的不同 .
p+1,指针是向后移动3个单位,q+1则是4个
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询