天天看点

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



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

#include

<stdio.h>

<stdlib.h>

void

main(void)

{

int

a[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();

指针数组

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

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

char *str[5]

= { "calc",

"notepad",

"tasklist",

"pause",

"mspaint" };

for (char

**pp =

str;

pp <

str + 5;pp++)

system(*pp);

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

#include<stdio.h>

#include<stdlib.h>

main(int

argc,

char *argv[])

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

char

str[5][10] = {

"calc",

printf("%p",str);

for (char(*p)[10]

= str;

str + 5;p++)

//打印地址  

字符串

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

system((char

*)p);

return 0;

二维数组

argc,char

*argv[])

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

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

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

system("pause");

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

//开辟二维数组的空间

int **p;

p = (int

**)malloc(sizeof(int)*

10);

i,j;

for (i

= 0; i < 10;i++)

p[i]

= (int *)malloc(sizeof(int)*

//初始化数组

= 0; i < 10;

i++)

for (j

= 0; j < 10;

j++)

*(*(p +

i) +

j) =

i *

j;

putchar(10);

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

= 0; j < 10;j++)

printf("%d

", *(*(p

+ i) +

j));

指针的加减法:

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

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

a[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);

p2 -

p3);

二维数组的打印问题

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

*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;

i = 0;

i < 3;

j = 0;

j < 4;j++)

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

//通过数组名的方式实现打印

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

//通过指针下标的方式实现

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

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

//通过下标的方式实现

结构体数组

#include<windows.h>

struct

pos{

x;

y;

};

pos

pos2[8] = {

{ 100, 200 },

{ 100, 0 },

{ 200,400 },

{ 300,600 },

{ 390,600 },

{ 190,900 },

{ 990,100},

{1390,600}

pos1[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 } }

main()

hwnd *win

= findwindowa("notepad++",

"notepad++");

if (win

== null)

return;

setwindowpos(win,

null, 0, 0, 100, 300, 1);

i < 8;

//设置窗口位置大小

null,

pos1[i][0].x,

pos1[i][0].y,

pos1[i][1].x,

pos1[i][1].y,

1);

sleep(3000);

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

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

/*

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

*/

searchmax(int

a[3][4])

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

printf("\nsearch

= %d",sizeof(a));

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

b = %d",sizeof(b));

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

max;  

//存储最大的值

max =

a[0][0];

i < 3;i++)

if (a[i][j]

> max)  

//比较大小

//接收最大的地址

a[i][j];

return

max;

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

searchmax(a);

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

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

searchmin(int(*p)[4])

//假设第一个是最小的

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

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

min = *(*(p

+ 0) + 0);

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

//if (p[i][j] <min) 

//{

// 

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

//}

if (*(*(p

+i) +

j) <

min)

j);

min;

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

printf("\nmin

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

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

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

static

searchmax(int(*p)[4])

//存储最大值

p[0][0];

if (p[i][j]

> max)

p[i][j];

    }

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

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

printarray(int

a[3][4][5])

i,j,k;

= 0; i < 3;i++)

= 0; j < 4;j++)

for (k

= 0; k < 5;k++)

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

a[3][4][5];

num = 0;

//求得数组的大小为240

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

//线性初始化

*p = &a[0][0][0];

p < &a[0][0][0]

+ 60;p++)

num;

num++;

printarray(a);

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

(*p)[4][5])

i,

j,

k;

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

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

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

//创建一维数组

int *p

40);

*px =

p,

px <

p + 40;

px++,i++)

//赋值

i;

//指针循环

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

b[5][8];

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

int(*pp)[8]

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

i < 5;i++)

j < 8;j++)

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

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

//pp[i][j]

int(*ppp)[2][5]

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

i < 4;

j < 2;j++)

k = 0;

k < 5;k++)

//打印元素

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

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

+ k));

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

数组

指针

数组访问

指针访问

int a[i]

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)

继续阅读