20130330 printf数组改变 数组指针便利二维数组 二级指针遍历二维数组 ZigZag

1、为什么printf之后数组的值会改变?

#include<stdio.h>
    const int N=8;
int * Zigzag()
{
    int i=0,j=0,limit=0;
    int count=0;
    int cross=0;
    int a[N][N];
    int (*p)[N]=a;
    for(cross=0;cross<N;cross++)
    {
        if(0==cross%2)
        {
            for(i=cross;i>=0;i--)
            {
                p[i][cross-i]=count;
                count++;
            }
        }
        if(1==cross%2)
        {
            for(i=0;i<=cross;i++)
            {
                p[i][cross-i]=count;
                count++;
            }
        }
    }

    return  &p[0][0];
}
void print(int a[])
{
    for(int i=0;i<N;i++)
    {    
        for(int j=0;j<N;j++)
        {    
            printf("%6d",a[i*N+j]);
        }
        printf("\n");
    }
}
int main()
{
    int *a;
    a=Zigzag();
printf("a:0x%x\n",a);
printf("%d ",*a);
printf("%d ",*(a+1));
printf("%d ",a[2]);
printf("%d ",a[3]);
//    print(a);
}

2、理解数组指针(指向指针的数组)

#include<stdio.h>
void main()
{
    const int N=3;
    int a[N][N]={{1,2,3},{4,5,6},{7,8,9}};
    int (*p)[N]=a;//p指向一个三维数组
    int *pp=&a[0][0];   
    printf("a:0x%x\n",a);
    printf("p:0x%x\n",p);
    printf("*p:0x%x\n",*p);
    printf("p+1:0x%x\n",p+1);
    printf("*p+1:0x%x\n",p+1);

}

3、N*N ZigZag数组

http://blog.csdn.net/fanzitao/article/details/7934659

#include<stdio.h>
const int N=8;

void print(int (*a)[N])
{
    for(int i=0;i<N;i++)
    {    
        for(int j=0;j<N;j++)
        {    
            printf("%6d",a[i][j]);
        }
        printf("\n\n");
    }
}
int main()
{

    int i=0,j=0,limit=0;
    int count=0;
    int cross=0;
    int a[N][N];
    int (*p)[N]=a;
    for(cross=0;cross<N;cross++)
    {
        if(0==cross%2)
        {
            for(i=cross;i>=0;i--)
            {p[i][cross-i]=count; count++;}
        }
        if(1==cross%2)
        {
            for(i=0;i<=cross;i++)
            {p[i][cross-i]=count;  count++;}
        }
    }
    
    limit=1;
        for(cross=N;cross<N+N-1;cross++)
        {
            if(0==cross%2)
                for(i=N-1;i>=limit;i--)
                {p[i][cross-i]=count; count++;}
                if(1==cross%2)
                    for(i=limit;i<=N-1;i++)
                    {p[i][cross-i]=count; count++;}
                    
            limit++;
        }
        print(a);
}

4、利用二级指针建立二维数组

#include<stdio.h>
#include<malloc.h>
#define  N 10
void main()
{
    int **a=(int **)malloc(N*sizeof(int));
    for(int i=0;i<N;i++)
        a[i]=(int *)malloc(N*sizeof(int *));
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
            a[i][j]=i;

    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
            printf("%6d",a[i][j]);
        printf("\n\n");
    }
}
posted @ 2014-03-30 20:38  yexuannan  阅读(573)  评论(0编辑  收藏  举报