二级指针和二维数组

intmain(){char*onedp=NULL;//onedimensionarraychar**twodp=NULL;//twodimensionarraychar... int main()
{
char *onedp = NULL; //one dimension array
char **twodp = NULL; //two dimension array
char a[3][16] = {"China_and_me", "c++", "It is a desk"};
int i = 0;

twodp = (char **)a;
for(i = 0; i < 3; i++)
{
printf("%s\n",a[i]);
printf("%s\n", twodp + i*4);
}
return 0;
}
请问一下,在输出语句printf("%s\n", twodp + i*4);中,为什么i*4?
展开
 我来答
kaixingui2012
推荐于2016-04-20 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6487万
展开全部
printf("%s\n", twodp + i*4); 严格来说这是错误的语句! twodp是二维指针,运算结果仍然是二维指针,所以用%s输出是错误的用法。

sizeof(char **)=4 (当然需要在32位编译系统上 ,64位会是8)

twodp+1会指向下一个地址,即跳过4个字节,你程序为了达到与a[i]输出同步的情况,因为a[3][16]的列是16,所以,twodp需要跳16个字节以到达相应的地址,你改成a[3][20] 你就会*5才可以了
更多追问追答
追问
printf("%s\n", twodp + i*4);既然说用%s输出是错误的用法,为什么编译的时候不报错呢?
追答
这和编译工具和编译设置有关!有的会报警告有的会报错误,也有的直接通过。
老镇玫瑰33挐榖
2014-08-09 · TA获得超过261个赞
知道答主
回答量:161
采纳率:100%
帮助的人:55.3万
展开全部
#include <stdio.h>

int main()
{
int n;//行数
int m;//列数
int i,j,k;
printf("请输入行数和列数:");
scanf("%d%d",&n,&m);
int **p;
p= new int*[n];
for(i=0; i<n; ++i)
p[i] = new int[m];
printf("请输入数组元素:");
for(j=0;j<n;j++)
{
for(k=0;k<m;k++)
scanf("%d",&p[j][k]);
}
printf("二维数组如下:\n");
for(j=0;j<n;j++)
{
for(k=0;k<m;k++)
printf("%d ",p[j][k]);
printf("\n");
}
for(i=0;i<n;i++)
delete[] p[i];
delete[] p;
return 0;
}
请采纳。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式