一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式
打印数组中的每个元素,打印每个元素的地址:
#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) |
一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式相关推荐
- linux c语言 malloc动态分配指针,C语言malloc函数为一维,二维,三维数组分配空间...
c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...
- c语言malloc申请三维数组,C语言malloc函数为一维,二维,三维数组分配空间
c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...
- C语言malloc函数为一维,二维,三维数组分配空间
c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...
- MATLAB一维、二维、三维 标量函数绘图
MATLAB一维.二维.三维 标量函数绘图 1. 一维标量绘图plot 2. 二维.三维标量绘图 2.1. mesh函数标量绘图 2.2. surf函数标量绘图 2.3. contour(x,y,z) ...
- C++数组(一维、二维、三维)的动态分配new、初始化memset和释放delete
[原文]http://blog.csdn.net/shanzhizi/article/details/7835752 数组的动态分配.初始化和释放经常用到,这里总结一下,尤其是二维数组 一维数组 一维 ...
- 神经网络之多维卷积的那些事(一维、二维、三维)
文章目录 前言 一维卷积Conv1d 二维卷积Conv2d 三维卷积Conv3d 卷积中的特征图大小计算方式 总结 前言 一般来说,一维卷积用于文本数据,二维卷积用于图像数据,对宽度和高度都进行卷积, ...
- 数组(一维数组、多维数组/二维数组)和简单排序算法
提示:数组是线性数据结构中最为基础,最为典型的一种顺序型结构. 它用一组连续的内存空间 ,来存储一组具有相同类型的数据. 与变量相比,变量是一种单一的数据存储方式,而数组是用于存储一连串的一组数据. ...
- C# 指定格式的字符串截成一维数组(二维数组)的操作类
指定格式的字符串截成一维数组(二维数组)的操作类 做项目时经常会遇到将"1,3,a,b,d"截成一维数组或将"1,a;2,b;3,c;4,d"截成二维数组.虽然 ...
- c 语言 二维数组地址,C/C++ 关于一维或二维数组首地址表示含义
C/C++ 关于一维或二维数组首地址表示含义 发布时间:2020-06-26 10:35:21 来源:51CTO 阅读:210 作者:sonissa 这是一个经常会忘却的知识点,最近也一直在吃这方面的 ...
- c/c++教程 - 1.7 数组 一维数组 二维数组
九.数组 数组:一个里面存放了相同类型数据元素的集合. 特点:每个数组中的元素都是相同的数据类型:数组是由连续的内存位置组成的. 注意:数组的下标是从0开始索引. 参考视频:https://www.b ...
最新文章
- 一文详解PnP算法原理
- android的init过程分析
- 背景se_SE新作《先驱者》首个内容预告 定于2020年圣诞发售
- JAVA实现单链表数据结构_java实现数据结构单链表示例(java单链表)
- linux 查找_如何在 Linux 上查找和删除损坏的符号链接 | Linux 中国
- 我的北京游戏开发总结【三】
- java异常捕获的一点感悟
- 红黑树中nil结点_什么是红黑树?程序员面试必问!
- 深入浅出MFC文档/视图架构之文档
- CrystalMaker 10.6.2 mac版 CrystalMaker X最新版
- MATLAB信号处理之信号的积分和微分
- HTML的基本知识(六)——表格的基本属性之实现个人简历
- 从校园情侣到教授夫妇,最好的科研爱情是一起进步
- 可遇不可求的Question之MYSQL获取自增ID的四种方法篇
- Zotero使用之自定义参考文献格式
- python模拟ios点击_iOS13 模拟点击 模拟触摸 按键模拟 自写按键精灵
- 计算机主板反复启动,主板无限重启怎么回事
- stm32 mbed 入门教程(一)---前期准备
- 高通 qca-wifi 移植
- Sitecore学习总结(1)
热门文章
- wxWidgets:wxContextHelp类用法
- boost::type_erasure::negatable相关的测试程序
- boost::mp11::mp_map_replace相关用法的测试程序
- boost::hana::adjust用法的测试程序
- boost::leaf::capture用法的测试程序
- GDCM:gdcm::StrictScanner的测试程序
- Boost:容器std::pair与宏BOOST_TEST_EQ相关的测试
- ITK:可视化静态稀疏Shi 2D水平设置图层
- DCMTK:OFStack类的测试程序
- VTK:小部件之DistanceWidget