c语言数组与指针问题
1.定义a[3],既然打出sizeof(a)为12即a占4*3=12字节,那为什么书上说与a捆绑在一起的只是数组首地址?那不应该只是4个字节吗?而且int*p=a成立,即...
1.定义a[3],既然打出sizeof(a)为12即a占4*3=12字节,那为什么书上说与a捆绑在一起的只是数组首地址?那不应该只是4个字节吗?而且int *p=a成立,即证明a为整形单元,可a为什么占用12字节呢?
2.定义一个数组指针,例如int ((*p)[3])[3];即有p[0],p[1],p[2],再定义一个数组a[3][3],如何让p[0],p[1],p[2]分别指向a的第一二三行,又怎么打印出来?
请高手来好吗? 展开
2.定义一个数组指针,例如int ((*p)[3])[3];即有p[0],p[1],p[2],再定义一个数组a[3][3],如何让p[0],p[1],p[2]分别指向a的第一二三行,又怎么打印出来?
请高手来好吗? 展开
2个回答
展开全部
1,书上说的不准确,数组应该看做一种独立的类型,sizeof只与类型有关。详细的可以参考这个:http://zhidao.baidu.com/question/74467735.html
如果你弄明白了这个剩下就简单了。
2,我先说一下结论吧。按照你的要求应该这样定义p: int* p[3];。因为你想要的是访问每一行的数字,所以需要p为整型指针的数组,这样每个元素是整型指针,可以像p[1][2]这样的方式访问每一行的内容。初始化即p[0]=a[0];p[1]=a[1];p[2]=a[2];(利用数组类型的隐式转换,a[2]本身是个数组,被转换成指向元素int的指针)
下面的内容如果你不打算设计一种语言或者写一个编译器的话,可以忽略。
现在来看你给的定义。按照1,把数组看做类型,按照内到外的类型分析法,p是个指针,指向一个3元素数组,元素为3元素的int数组。而数组a可以转换成元素指针,俗话说就是p要比a转换成的指针高一个层次。而且c语言没有数组赋值和取地址。。。。所以,你的p如果没有强制类型转化是没法向你想的那样初始化的。你可以这样验证一下:
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(p[0][0]));
printf("%d\n", sizeof(p[0][0][0]));
大概就可以知道他们是什么了。
如果直接p[0]=&a[0][0];p[1]=&a[1][0];p[2]=&a[2][0],先不说类型不一致(就算可以强制转换),还会造成非法内存访问的,因为你没有初始p指针就给内存赋值了。
那么,按照你的要求,p应该是一个3元素数组,每个元素指向一个3元素整型数组。所以p应定义为int (*p[3])[3]; 这样就符合要求了,可以使用上面的方法验证一下。
但是遗憾的是,这样做不能具有一致的元素访问方式,你想要访问内容必须使用p[0][0][0]的形式。这种类型与访问不一致主要是由于数组的隐式类型转换导致的。这个问题就牵涉到语言本身的语法定义问题了,深究的话。。。。可以出书了。
所以你还是使用我最前面给出的方式定义p吧,虽然看起来p只是指向int的指针数组,不符合指向“a的第一二三行”的语义(就是说不能用sizeof来获得每行的长度)。
如果你弄明白了这个剩下就简单了。
2,我先说一下结论吧。按照你的要求应该这样定义p: int* p[3];。因为你想要的是访问每一行的数字,所以需要p为整型指针的数组,这样每个元素是整型指针,可以像p[1][2]这样的方式访问每一行的内容。初始化即p[0]=a[0];p[1]=a[1];p[2]=a[2];(利用数组类型的隐式转换,a[2]本身是个数组,被转换成指向元素int的指针)
下面的内容如果你不打算设计一种语言或者写一个编译器的话,可以忽略。
现在来看你给的定义。按照1,把数组看做类型,按照内到外的类型分析法,p是个指针,指向一个3元素数组,元素为3元素的int数组。而数组a可以转换成元素指针,俗话说就是p要比a转换成的指针高一个层次。而且c语言没有数组赋值和取地址。。。。所以,你的p如果没有强制类型转化是没法向你想的那样初始化的。你可以这样验证一下:
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(p[0][0]));
printf("%d\n", sizeof(p[0][0][0]));
大概就可以知道他们是什么了。
如果直接p[0]=&a[0][0];p[1]=&a[1][0];p[2]=&a[2][0],先不说类型不一致(就算可以强制转换),还会造成非法内存访问的,因为你没有初始p指针就给内存赋值了。
那么,按照你的要求,p应该是一个3元素数组,每个元素指向一个3元素整型数组。所以p应定义为int (*p[3])[3]; 这样就符合要求了,可以使用上面的方法验证一下。
但是遗憾的是,这样做不能具有一致的元素访问方式,你想要访问内容必须使用p[0][0][0]的形式。这种类型与访问不一致主要是由于数组的隐式类型转换导致的。这个问题就牵涉到语言本身的语法定义问题了,深究的话。。。。可以出书了。
所以你还是使用我最前面给出的方式定义p吧,虽然看起来p只是指向int的指针数组,不符合指向“a的第一二三行”的语义(就是说不能用sizeof来获得每行的长度)。
参考资料: http://zhidao.baidu.com/question/74467735.html
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询