- 打印数组中的每个元素,打印每个元素的地址:
#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) |
一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式,布布扣,bubuko.com