首页 > 代码库 > 一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式


  1. 打印数组中的每个元素,打印每个元素的地址:

#include<stdio.h>

#include<stdlib.h>

 

voidmain(void)

{

   inta[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   for (int *p =a;p <a + 10;p++) //指针类型决定4个字节

   {

       printf("\n%p,%d",p, *p);

   }

   getchar();

}

  1. 指针数组

#include<stdio.h>

#include<stdlib.h>

 

voidmain(void)

{

   //轮询数组的时候,可以用指针轮询

   //通过指针数组,可以管理地址

   char *str[5] = { "calc","notepad","tasklist","pause","mspaint" };

   for (char **pp =str;pp <str + 5;pp++)

   {

       system(*pp);

   }

   getchar();

}

  1. 数组指针(等价于二维数组)

#include<stdio.h>

#include<stdlib.h>

intmain(intargc,char *argv[])

{

   //二维数组,等价于二级指针

   charstr[5][10] = {"calc","notepad","tasklist","pause","mspaint" };

   printf("%p",str);

   for (char(*p)[10] = str;p <str + 5;p++)

   {

       //打印地址  字符串

       printf("\n%p,%s",p,p);

       system((char *)p);

   }

   return 0;

}

  1. 二维数组

#include<stdio.h>

#include<stdlib.h>

intmain(intargc,char *argv[])

{

   charstr[5][10] = {"calc","notepad","tasklist","pause","mspaint" };

   //指针地址一样,但是类型不一样

   //str代表行地址,&str代表整个数组的地址,*str就是第一个字符的地址

   printf("%p,%p,%p",str,&str,*str);

 

   system("pause");

   return 0;

}

  1. 二维数组的开辟方式已经打印:

#include<stdio.h>

#include<stdlib.h>

 

intmain(intargc,char *argv[])

{

   //开辟二维数组的空间

   int **p;

   p = (int **)malloc(sizeof(int)* 10);

   inti,j;

   for (i = 0; i < 10;i++)

   {

       p[i] = (int *)malloc(sizeof(int)* 10);

   }

   //初始化数组

   for (i = 0; i < 10;i++)

   {

       for (j = 0; j < 10;j++)

       {

           *(*(p +i) +j) =i *j;

       }

       putchar(10);

   }

 

   //通过指针的方式打印出二维数组

   for (i = 0; i < 10;i++)

   {

       for (j = 0; j < 10;j++)

       {

           printf("%d ", *(*(p + i) +j));

       }

       putchar(10);

   }

 

   system("pause");

   return 0;

}

  1. 指针的加减法:

#include<stdio.h>

#include<stdlib.h>

 

intmain(intargc,char *argv[])

{

   //c语言运算规则,加法原则实际加上的是:元素的大小*加上的数

   //减法原则实际上减去的是:元素的大小*减去的数              

   inta[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

   printf("%p\n",a);

   int *p1 = &a[0][0];

   int *p2 = p1 + 4;

   printf("%d\n",*p2);

   int *p3 = p2 - 3;

   printf("\n%d", *p3);

   printf("\n%d",p2 -p3);

 

   system("pause");

   return 0;

}

  1. 二维数组的打印问题

#include<stdio.h>

#include<stdlib.h>

 

intmain(intargc,char *argv[])

{

   //c语言运算规则,加法原则实际加上的是:元素的大小*加上的数

   //减法原则实际上减去的是:元素的大小*减去的数              

   inta[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

   //将数组中的每个元素一个个打印出来

   for (int *p = &a[0][0];p < &a[0][0] + 12; p++)

   {

       //下面的一句实现的是每过4个元素换行一下

       if ((p - &a[0][0]) % 4 == 0)

       {

           printf("\n");

       }

       printf("%5d",*p);

   }

   printf("\n\n\n");

   //a是一个常量的行指针,a的类型与px等价

   int(*px)[4] = a;

   for (inti = 0;i < 3;i++)

   {

       for (intj = 0;j < 4;j++)

       {

           //printf("%5d",a[i][j]);    //通过数组名的方式实现打印

           //printf("%5d",px[i][j]);   //通过指针下标的方式实现

           //printf("%5d",*(px[i]+ j));//通过指针的方式实现

           printf("%5d",*(*(px+i)+j)); //通过下标的方式实现

       }

       printf("\n");

   }

 

   system("pause");

   return 0;

}

  1. 结构体数组

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

 

structpos{

   intx;

   inty;

};

 

structpospos2[8] = {

   { 100, 200 },

   { 100, 0 },

   { 200,400 },

   { 300,600 },

   { 390,600 },

   { 190,900 },

   { 990,100},

   {1390,600}

};

 

structpospos1[8][2] = {

   { { 200, 0 }, { 900, 800 } },

   { { 0, 0 }, { 800, 1300 } },

   { { 1500, 200 }, { 600, 900 } },

   { { 800, 700 }, { 700, 800 } },

   { { 300, 100 }, { 600, 700 } },

   { { 900, 800 }, { 700, 700 } },

   { { 100, 200 }, { 800, 800 } }

};

 

voidmain()

{

   HWND *win = FindWindowA("Notepad++","Notepad++");

   if (win == NULL)

   {

       return;

   }

   SetWindowPos(win,NULL, 0, 0, 100, 300, 1);

 

   for (inti = 0;i < 8;i++)

   {

       //设置窗口位置大小

       SetWindowPos(win,NULL,pos1[i][0].x,pos1[i][0].y,pos1[i][1].x,pos1[i][1].y, 1);

       Sleep(3000);

   }

   system("pause");

}

  1. 作为通过函数改变二维数组中各各参数的值,和打印相关的知识点

#include<stdio.h>

#include<stdlib.h>

/************************************************************************/

/*一维数组没有副本机制,二维数组也没有,数组作为参数都是传递地址      */

/************************************************************************/

intsearchmax(inta[3][4])

{

   //通过数组传递过来的数组,求大小的时候都是432位系统情况)

   printf("\nsearch = %d",sizeof(a));

   intb[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2 };

   printf("\nsearch b = %d",sizeof(b));

   

   //下面开始求数组的最大值

   intmax;  //存储最大的值

   max =a[0][0];

   for (inti = 0;i < 3;i++)

   {

       for (intj = 0;j < 4;j++)

       {

           if (a[i][j] > max)  //比较大小

           {

               //接收最大的地址

               max =a[i][j];

           }

       }

   }

   returnmax;

}

 

intmain(intargc,char *argv[])

{

   inta[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2 };

   intmax =searchmax(a);

 

   printf("\n二维数组的最大值为:%d\n",max);

 

   system("pause");

   return 0;

}

  1. 求二维数组中元素的最小值

#include<stdio.h>

#include<stdlib.h>

intsearchmin(int(*p)[4])

{

   //假设第一个是最小的

   //int min = p[0][0];

   //同样可以使用下面的方式实现

   intmin = *(*(p + 0) + 0);

 

   for (inti = 0;i < 3;i++)

   {

       for (intj = 0;j < 4;j++)

       {

           //第一种方式通过数组下标的方式实现

           //if (p[i][j] <min) //比较大小

           //{

           // min = p[i][j]; //求出最小的数

           //}

 

           if (*(*(p +i) +j) <min)

           {

               min = *(*(p + i) +j);

           }

       }

   }

   returnmin;

}

 

intmain(intargc,char *argv[])

{

   inta[3][4] = { 1, 2, 3, 4, 5, 16, -7, 8, 9, 10, 1, 2 };

 

   printf("\nmin = %d\n",searchmin(a));

 

   system("pause");

   return 0;

}

  1. 通过指针的方式实现求二维数组中的最大值

#include<stdio.h>

#include<stdlib.h>

 

/************************************************************************/

/*二维数组退化为一个指向有4个元素的数组的指针                         */

/************************************************************************/

staticintsearchmax(int(*p)[4])

{

   //存储最大值

   intmax =p[0][0];

   for (inti = 0;i < 3;i++)

   {

       for (intj = 0;j < 4;j++)

       {

           if (p[i][j] > max)

           {

               max =p[i][j];

           }

       }

   }

   returnmax;

}

 

intmain(intargc,char *argv[])

{

   inta[3][4] = { 1, 2, 3, 4, 5, 16, -7, 8, 9, 10, 1, 2 };

 

   printf("\nmin = %d\n",searchmax(a));

 

   system("pause");

   return 0;

}

12.三维数组定义,并通过数组的方式打印出来

#include<stdio.h>

#include<stdlib.h>

 

voidprintArray(inta[3][4][5])

{

   inti,j,k;

   for (i = 0; i < 3;i++)

   {

       for (j = 0; j < 4;j++)

       {

           for (k = 0; k < 5;k++)

           {

               printf("%4d",a[i][j][k]);

           }

           printf("\n");

       }

       printf("\n\n\n");

   }

}

 

intmain(intargc,char *argv[])

{

   inta[3][4][5];

   intnum = 0;

   //求得数组的大小为240

   printf("%d\n",sizeof(a));

 

   //线性初始化

   for (int *p = &a[0][0][0];p < &a[0][0][0] + 60;p++)

   {

       *p =num;

       num++;

   }

 

   printArray(a);

 

   system("pause");

   return 0;

}

13.三维数组定义,并通过指针的方式打印出来

#include<stdio.h>

#include<stdlib.h>

 

staticvoidprintArray(int (*p)[4][5])

{

   inti,j,k;

   for (i = 0; i < 3;i++)

   {

       for (j = 0; j < 4;j++)

       {

           for (k = 0; k < 5;k++)

           {

               //printf("%4d",p[i][j][k]);

               printf("%4d",*(*(*(p+i)+j)+k));

           }

           printf("\n");

       }

       printf("\n\n\n");

   }

}

 

intmain(intargc,char *argv[])

{

   inta[3][4][5];

   intnum = 0;

   //线性初始化

   for (int *p = &a[0][0][0];p < &a[0][0][0] + 60;p++)

   {

       *p =num;

       num++;

   }

   

   printArray(a);

   system("pause");

   return 0;

}

14.通过指针类型改变访问数组访问

#include<stdio.h>

#include<stdlib.h>

 

intmain(intargc,char *argv[])

{

   //创建一维数组

   int *p = (int *)malloc(sizeof(int)* 40);

   for (int *px =p,i = 0;px <p + 40;px++,i++)

   {

       //赋值

       *px =i;

       //指针循环

       //printf("%d,%p\n",*px,px);

   }

 

   intb[5][8];

   printf("\n\n\n");

   //指针类型决定了访问的方式

   int(*pp)[8] = (int(*)[8])p;

   for (inti = 0;i < 5;i++)

   {

       for (intj = 0;j < 8;j++)

       {

           //printf("%5d",pp[i][j]);打印数据

           printf("%5d",*(*(pp+i)+j));//pp[i][j]

       }

       printf("\n");

   }

 

   printf("\n\n\n");

   int(*ppp)[2][5] = (int(*)[2][5])p;

   for (inti = 0;i < 4;i++)

   {

       for (intj = 0;j < 2;j++)

       {

           for (intk = 0;k < 5;k++)

           {

               //打印元素

               //printf("%5d",ppp[i][j][k]);

               printf("%5d",*(*(*(ppp+i)+j) + k));

           }

           printf("\n");

       }

       printf("\n\n\n");

   }

 

   system("pause");

   return 0;

}

 

总结:下面左边定义的数组和右边的指针是等价的

数组

指针

数组访问

指针访问

int a[i]

int *p

a[i]

*(p + i)

int a[i][j]

int (*p)[j]

a[i][j]

*(*(p+i)+j)

int a[i][j][k]

int (*p)[j][k]

a[i][j][k]

*(*(*(p+i)+j)+k)

int a[i][j][k][l]

int (*p)[i][j][k]

a[i][j][k][l]

*(*(*(*(p+i)+j)+k)+l)