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)

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

  1. linux c语言 malloc动态分配指针,C语言malloc函数为一维,二维,三维数组分配空间...

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

  2. c语言malloc申请三维数组,C语言malloc函数为一维,二维,三维数组分配空间

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

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

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

  4. MATLAB一维、二维、三维 标量函数绘图

    MATLAB一维.二维.三维 标量函数绘图 1. 一维标量绘图plot 2. 二维.三维标量绘图 2.1. mesh函数标量绘图 2.2. surf函数标量绘图 2.3. contour(x,y,z) ...

  5. C++数组(一维、二维、三维)的动态分配new、初始化memset和释放delete

    [原文]http://blog.csdn.net/shanzhizi/article/details/7835752 数组的动态分配.初始化和释放经常用到,这里总结一下,尤其是二维数组 一维数组 一维 ...

  6. 神经网络之多维卷积的那些事(一维、二维、三维)

    文章目录 前言 一维卷积Conv1d 二维卷积Conv2d 三维卷积Conv3d 卷积中的特征图大小计算方式 总结 前言 一般来说,一维卷积用于文本数据,二维卷积用于图像数据,对宽度和高度都进行卷积, ...

  7. 数组(一维数组、多维数组/二维数组)和简单排序算法

    提示:数组是线性数据结构中最为基础,最为典型的一种顺序型结构. 它用一组连续的内存空间 ,来存储一组具有相同类型的数据. 与变量相比,变量是一种单一的数据存储方式,而数组是用于存储一连串的一组数据. ...

  8. C# 指定格式的字符串截成一维数组(二维数组)的操作类

    指定格式的字符串截成一维数组(二维数组)的操作类 做项目时经常会遇到将"1,3,a,b,d"截成一维数组或将"1,a;2,b;3,c;4,d"截成二维数组.虽然 ...

  9. c 语言 二维数组地址,C/C++ 关于一维或二维数组首地址表示含义

    C/C++ 关于一维或二维数组首地址表示含义 发布时间:2020-06-26 10:35:21 来源:51CTO 阅读:210 作者:sonissa 这是一个经常会忘却的知识点,最近也一直在吃这方面的 ...

  10. c/c++教程 - 1.7 数组 一维数组 二维数组

    九.数组 数组:一个里面存放了相同类型数据元素的集合. 特点:每个数组中的元素都是相同的数据类型:数组是由连续的内存位置组成的. 注意:数组的下标是从0开始索引. 参考视频:https://www.b ...

最新文章

  1. 一文详解PnP算法原理
  2. android的init过程分析
  3. 背景se_SE新作《先驱者》首个内容预告 定于2020年圣诞发售
  4. JAVA实现单链表数据结构_java实现数据结构单链表示例(java单链表)
  5. linux 查找_如何在 Linux 上查找和删除损坏的符号链接 | Linux 中国
  6. 我的北京游戏开发总结【三】
  7. java异常捕获的一点感悟
  8. 红黑树中nil结点_什么是红黑树?程序员面试必问!
  9. 深入浅出MFC文档/视图架构之文档
  10. CrystalMaker 10.6.2 mac版 CrystalMaker X最新版
  11. MATLAB信号处理之信号的积分和微分
  12. HTML的基本知识(六)——表格的基本属性之实现个人简历
  13. 从校园情侣到教授夫妇,最好的科研爱情是一起进步
  14. 可遇不可求的Question之MYSQL获取自增ID的四种方法篇
  15. Zotero使用之自定义参考文献格式
  16. python模拟ios点击_iOS13 模拟点击 模拟触摸 按键模拟 自写按键精灵
  17. 计算机主板反复启动,主板无限重启怎么回事
  18. stm32 mbed 入门教程(一)---前期准备
  19. 高通 qca-wifi 移植
  20. Sitecore学习总结(1)

热门文章

  1. wxWidgets:wxContextHelp类用法
  2. boost::type_erasure::negatable相关的测试程序
  3. boost::mp11::mp_map_replace相关用法的测试程序
  4. boost::hana::adjust用法的测试程序
  5. boost::leaf::capture用法的测试程序
  6. GDCM:gdcm::StrictScanner的测试程序
  7. Boost:容器std::pair与宏BOOST_TEST_EQ相关的测试
  8. ITK:可视化静态稀疏Shi 2D水平设置图层
  9. DCMTK:OFStack类的测试程序
  10. VTK:小部件之DistanceWidget