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

浙公网安备 33010602011771号