当前位置:C++技术网 > 资讯 > 求各位大神解答C++一些基础问题

求各位大神解答C++一些基础问题

更新时间:2016-06-16 22:35:21浏览次数:1+次

# include<stdio.h>
void main()
{
 int a[3][5],i,j;
 int *adress;
    for(i=0;i<3;i++)
    {
     printf("\n");
    }
 for(j=0;j<5;j++)   
     {
      adress=&a[i][j];
      printf("%d",adress);
     }
}

各位错在哪里

题目是设计一个程序,返回一个3*5的二维数组各元素的地址,并由此说明二维数组中个元素是按什么顺序存储的

原谅一个新手的基础问题 马上期末了!!!


C++技术网解答:

程序没有运行错误,只是执行结果和预期不一样。
1.原本想输出一个行地址,换一行,结果是开头空了3行。问题在于什么时候输出换行,什么时候就执行换行。一开始就换行了,所以就是看到开头就换行了。
2.要实现一行地址换行,使用循环嵌套就可以了。也就是将你写的两个循环嵌套起来。把j这个循环放入i里面即可。而且一般都是一行输出完才换行,开始就先换行的话,第一行空出来了,不好看。地址之间用空格隔开,这样看起来就不是连在一起的。
第2步改造后的代码如下:

# include<stdio.h>
void main()
{
    int a[3][5], i, j;
    int *adress;
    for (i = 0; i<3; i++)
    {
        for (j = 0; j<5; j++)
        {
            adress = &a[i][j];
            printf("%d ", adress);
        }
        printf("\n");
    }
}

3.如果只是观察地址的变化,这就够了。不过一般地址是以十六进制输出的,所以你可以使用%X或%x替换掉%d,或者直接使用%p输出指针。
4.你可以观察到地址变化是每隔4一变化,实际上是每一个元素是int,占四个字节。总体上是连续的,说明数组内存是连续的分配的一整块。
5.最终的结果:

#include <stdio.h>
void main()
{
    int a[3][5], i, j;
    int *adress;
    for (i = 0; i<3; i++)
    {
        for (j = 0; j<5; j++)
        {
            adress = &a[i][j];
            printf("%p ", adress);
        }
        printf("\n");
    }
}
注意:学习程序分析程序一定要有耐心,而不是为了考试,这样才会有兴趣,也能学的更好。加油学习。如果小问题很多,可以加群讨论,如果问题比较大,比较多,还是这样发文章提问,得到的解答更加详细。而且提问的问题,要仔细描述,越详细我们能够越快解答。简介写上问题描述会更好。