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



  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)

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

时间: 2024-10-23 13:52:39

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

C语言malloc函数为一维,二维,三维数组分配空间

c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请所取空间的大小,因为没有在声明部分定义它们为变量或数组,所以不能通过变量名或数组的方式去引用这些数据,只能通过指针来引用. 对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这四个函数. 接下来写一下malloc函数如何实现为一维,二维,三维数

PHP:数组——二维转一维,二维转三维,将特定的数据作为键名

今天针对数组做一个总结,一句话:当我们面临多个数据时,要灵活运用数组+foreach去获取我们想要的结果 例子: 1.二维转一维数组 代码部分: 结果: 2.二维转三维 (1)代码部分:(显示方式1:将输出放在foreach循环里面) 结果: (1)代码部分:(显示方式2:将输出放在foreach循环外面) 结果: 什么时候在循环里面输出结果,什么时候在循环外面输出结果: (1)放在foreach里面打印,通常是只看一次就够了,打印後就 exit() (2)放在foreach外面打印,通常是看全

C#调用C++ 平台调用P/Invoke 结构体--含有内置数据类型的一维、二维数组、字符串指针【六】

[1]结构体中含有内置数据类型的一维数组 C++代码: typedef struct _testStru3 { int iValArrp[30]; WCHAR szChArr[30]; }testStru3; EXPORTDLL_API void Struct_ChangeArr( testStru3 *pStru ) { if (NULL == pStru) { return; } pStru->iValArrp[0] = 8; lstrcpynW(pStru->szChArr, L&quo

C++ 一维数组 二维数组 指针

1.int a[3] = {1, 2, 3}a代表数组的首地址&a[0]也是数组的首地址 2.// int a[2][2] = {0, 1, 2, 3}; // **a 就是 a[0][0] 第一行第一列.// *(*a + 1) 就是 a[0][1] 第一行第二列.// **(a + 1) 就是 a[1][0] 第二行第一列.// *(*(a + 1) + 1) 就是 a[1][1] 第二行第二列. 3.int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9

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

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

C语言学习笔记:18_数组-二维数组

/* * 18_数组-二维数组.c * * Created on: 2015年7月6日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> /** * 二维数组: * 为什么要用二维数组呢; * 例如: 网络班有2个班,每班有5人. * 要想存储一班的学生的年龄 定义一个一维数组搞定 int ages[5]={18,19,20,18,19}; * 然后将两个班中的所有年龄分开存入一个数组中 int classes[2]

2015.12.13 二维数组 函数指针 结构体

先说一下指针的用途:1.访问函数,在函数内部需要改变外部传入内部的值:2.函数中需得到一个连续存储空间的首地址:3.动态分配内存,需要记录分配内存的首地址.说穿了,指针的用途就是和地址相关的. 二维数组 定义方法 ①int temp1 [2][3] = {}; 第一个中括号是“行”,第二个中括号是“列”. ②int temp2 [][3] = {1,2,3,4,5,6}; “列数”不需要明确指出. ③int temp3 [2][3] = {1,2,3,4}; 后两个元素为0. char *nam

数据结构 二维数组--&gt;稀疏数组--&gt;二维数组

稀疏数组基本概念: 稀疏数组应用场景: 当一个数组大部分的元素为"0",或者为同一个值的数组时,可以使用稀疏数组来保存该数组 处理方法: 1>记录数组一共有几行几列,有多少不同的值 2>把具有不同值的元素行列及值记录在一个小规模数组中,从而缩小程序规模 row col val [0]   总行       总列 有效数量 [1]  第一个数据行  第一个数据列 第一个数据值 [2]  第二个数据行 第二个数据列 第二个数据值 二维数组==>稀疏数组思路: 1>遍

结构体最后的长度为0或1数组的作用--零长数组

其实很早在看LINUX下就看到这个东西,后来在李先静的<系统程序员成长计划>里看到了类似的定义,于是心里想着总结一下,结果发现网上已经有牛人总结的很好了,于是乎就转了过来,谢谢你们的分享,这是我前进的动力! 同时,需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在.(C99允许.微软的VS系列报一个WARNING,即非常的标准扩展.) 结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直

C++ 在堆上开辟与释放二维、三维指针

//C++ 在堆上开辟与释放二维.三维指针 #include<iostream> using namespace std; int main() { //二级指针的开辟与释放 int number = 0; int** p = new int*[4]; for(int i = 0; i < 4; i++) //分级定义数组大小 { p[i] = new int[4]; } for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j