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"); } }