您的位置:首页 > 其它

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

2014-08-01 01:08 483 查看


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

#include
<stdio.h>

#include
<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();

}

指针数组

#include
<stdio.h>

#include
<stdlib.h>

void
main(void)

{

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

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

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

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

{

system(*pp);

}

getchar();

}

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

#include<stdio.h>

#include<stdlib.h>

int
main(int
argc,
char *argv[])

{

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

char
str[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;

}

二维数组

#include<stdio.h>

#include<stdlib.h>

int
main(int
argc,char
*argv[])

{

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

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

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

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

system("pause");

return 0;

}

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

#include<stdio.h>

#include<stdlib.h>

int
main(int
argc,char
*argv[])

{

//开辟二维数组的空间

int **p;

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

int
i,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;

}

指针的加减法:

#include
<stdio.h>

#include<stdlib.h>

int
main(int
argc,char
*argv[])

{

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

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

int
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);

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

system("pause");

return 0;

}

二维数组的打印问题

#include
<stdio.h>

#include<stdlib.h>

int
main(int
argc,char
*argv[])

{

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

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

int
a[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 (int
i = 0;
i < 3;
i++)

{

for (int
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));
//通过下标的方式实现

}

printf("\n");

}

system("pause");

return 0;

}

结构体数组

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

struct
pos{

int
x;

int
y;

};

struct
pos
pos2[8] = {

{ 100, 200 },

{ 100, 0 },

{ 200,400 },

{ 300,600 },

{ 390,600 },

{ 190,900 },

{ 990,100},

{1390,600}

};

struct
pos
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 } }

};

void
main()

{

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

if (win
== NULL)

{

return;

}

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

for (int
i = 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");

}

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

#include
<stdio.h>

#include
<stdlib.h>

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

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

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

int
searchmax(int
a[3][4])

{

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

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

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

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

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

int
max;
//存储最大的值

max =
a[0][0];

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

{

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

{

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

{

//接收最大的地址

max =
a[i][j];

}

}

}

return
max;

}

int
main(int
argc,
char *argv[])

{

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

int
max =
searchmax(a);

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

system("pause");

return 0;

}

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

#include
<stdio.h>

#include<stdlib.h>

int
searchmin(int(*p)[4])

{

//假设第一个是最小的

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

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

int
min = *(*(p
+ 0) + 0);

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

{

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

{

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

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

//{

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

//}

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

{

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

}

}

}

return
min;

}

int
main(int
argc,char
*argv[])

{

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

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

system("pause");

return 0;

}

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

#include
<stdio.h>

#include<stdlib.h>

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

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

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

static
int
searchmax(int(*p)[4])

{

//存储最大值

int
max =
p[0][0];

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

{

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

{

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

{

max =
p[i][j];

}

}

}

return
max;

}

int
main(int
argc,char
*argv[])

{

int
a[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>

void
printArray(int
a[3][4][5])

{

int
i,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");

}

}

int
main(int
argc,
char *argv[])

{

int
a[3][4][5];

int
num = 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>

static
void
printArray(int
(*p)[4][5])

{

int
i,
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");

}

}

int
main(int
argc,
char *argv[])

{

int
a[3][4][5];

int
num = 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>

int
main(int
argc,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);

}

int
b[5][8];

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

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

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

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

{

for (int
j = 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 (int
i = 0;
i < 4;
i++)

{

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

{

for (int
k = 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐