|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
void func(int b[][3]);
void func(int b[][3])
{
printf("%d\n", b[2][2]);
}
int main(void)
{
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
func(a); //这个a传的应该是数组第一个元素的地址吧吧,那应该是1??
return 0;
}
函数里面就应该是然后b【1】【3】,这个数组应该还是去a的数,但是怎么会有b【2】【2】???不是越界么,但是越界就还是取a的值,有没有大佬解释一下
#include <stdio.h>
void func(int b[][3]);
void func(int b[][3])
{
printf("%d\n", b[2][2]);
}
int main(void)
{
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
/*
b[4][3]={
{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12}
}
*/
func((int(*)[3])a); //
return 0;
}
我用vs2017调试的时候,不能直接传a的,需要传确定的指针类型
总的来说
作为函数参数的数组,其实你传递进去的是数组的地址,啥意思,就是你传递的是一个指针而已
那么请问,指针如何与数组相转换?
相比你应该见过这样子的例子,b[2][2] = *(*(b+2)+2)
对于指针的偏移,你要理解它不同的含义,你可以试着sizeof(b) 和sizeof(*b),看看两个的长度
对于这个式子: *(*(b+2)+2)
我们像因式分解一样,慢慢分析
b+2 这是啥意思,是从b指针这个地址开始,偏移 sizeof(b)*2个长度
*(b+2)+2 是指 从b+2的所处的地址开始,偏移sizeof(*b)*2的长度
如果在再琢磨下,就会发现
对于一个
假设是
b[4][3]={
{1,2,3},//0
{4,5,6},//1
{7,8,9},//2
{10,11,12}//3
}
所谓 b+2 其实就是让指针指向 大数组的{7,8,9}这个小数组的头部
所谓 *(b+2)+2 其实就是让指针从小数组的头部偏移两个单位 从7偏移两个,是多少?
请记住,此刻还是地址,那取地址上的内容,则应该是 *(*(b+2)+2 ) =9
你把这个搞明白了,问题就迎刃而解了。
|
|