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



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

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

}

  1. 指针数组

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

}

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

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

}

  1. 二维数组

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

}

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

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

}

  1. 指针的加减法:

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

}

  1. 二维数组的打印问题

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

}

  1. 结构体数组

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

}

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

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

}

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

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

}

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

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

 

时间: 2024-08-22 14:15:48

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

VS2013下动态数组二维数组读二进制文件的问题

问题描述 VS2013下动态数组二维数组读二进制文件的问题 int samples_to_read = 7200; uint8_t **caculate_a; int count2,count3; caculate_a = (uint8_t **)malloc(sizeof(uint8_t *)* 3); for (count1 = 0; count1<3; count1++){ //动态数组分配空间 caculate_a[count1] = (uint8_t *)malloc(sizeof(u

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+   指针数组: 在一个数组中,如果它的元素全部都是指针

php打乱数组二维数组多维数组的简单实例_php实例

php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 <?php function shuffle_assoc($list) { if (!is_array($list)) return $list; $keys = array_keys($list); shuffle($keys); $random = array(); foreach ($keys as $key) $random[$key] = $list[$key]; return $random

php打乱数组二维数组多维数组的简单实例

php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 <?php function shuffle_assoc($list) { if (!is_array($list)) return $list; $keys = array_keys($list); shuffle($keys); $random = array(); foreach ($keys as $key) $random[$key] = $list[$key]; return $random

【C语言】关于结构体最后的长度为0或1数组的思考

需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在.但最新的C/C++不知道是否可以,我没有测试过.(C99允许.微软的VS系列报一个WARNING,即非常的标准扩展.) 结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申

函数模板 结构体数组-C++中带有数组参数的函数模板是否可以实例化为结构体数组类型来进行比较等操作?

问题描述 C++中带有数组参数的函数模板是否可以实例化为结构体数组类型来进行比较等操作? 不管什么类型的数组,都有一些类似的操作,因此可以使用函数模板实现代码复用.但是我在实现"查找"功能时不知道怎么处理结构体数组.要保证函数模板不仅适用于结构体数组,还适用于其他数组.求助各位大神! #include using namespace std; #define N 10 struct stu { int num; double score; }; /*查找:查找某元素,返回其下标*/ t

存储-获取一维或二维条码 多条内容,

问题描述 获取一维或二维条码 多条内容, 有这样一个思路:先取得手机相机权限, 获得相机自动对焦,获取一维或二维条码 多条内容,存储内容到一个文本.这样可以 实现吗?请朋友们指点 解决方案 没什么不可以. 条码扫出来只不过是一个字符串,你可以用特定的分隔符(比如回车换行)把多次扫描结果拼起来就成了. 解决方案二: 网上有二维码的控件,你随便参考一个就行,都是封装好的,在回调方法里会给你返回扫出来的二维码信息(也就是一串字符串,多数为url),你再把这些数据存到本地,至于储存方式很多(你可以百度)

从二维到三维——网络广告效果“大跃进”攻略

导读:线上广告被线下思维套牢?!有人认为:这简直是暴殓天物.网络--可以无限宽阔.无限纵深的多维世界,为什么要因循平面的规律呢?二维跃进到三维,简单的二加一,却可能使整个行业前景为之宽阔.作为网络广告界资深的一线操刀者,Harry Gold对行业弊病有着最当下的体会,最凌厉地反思. 他认为:当线下广告欲在线上施展拳脚时,对不起,请听听专业线上广告人士的意见.清晰地揭示行业本质,只为了深刻挖掘行业价值.十年从业,沙里淘金.Harry Gold的五项建议,实战价值非比寻常.广告人员(无论线上与线下)

php判断数组是一维、二维、还是多维方法

列一  代码如下 复制代码 <?php /**  * 返回数组的维度  * @param  [type] $arr [description]  * @return [type]      [description]  */ function arrayLevel($arr){     $al = array(0);     function aL($arr,&$al,$level=0){         if(is_array($arr)){             $level++;  

c# 结构 数组-帮忙看一段c#程序,关于结构体的

问题描述 帮忙看一段c#程序,关于结构体的 public struct MyStruct { public double Distance; public double Intensity; } MyStruct[,] LaserInfo = new MyStruct[3600*12, 3]; 最后一行是什么意思呢 解决方案 3600*12行,每行3列的数组