天天看點

一維數組,二維數組,三維數組,數組與指針,結構體數組,通過改變指針類型改變通路數組的方式



列印數組中的每個元素,列印每個元素的位址:

#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)

繼續閱讀