一 二维数组与数组指针的关系

二维数组名,代表的是第0行的行地址,“+1”是跳过一个行。而取“ * ”的话,则是在当前行地址基础上再取列地址,那么如果我们再取一个“ * ”呢?就会取出对应的行和列的具体的值。

example:

int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

arr==arr[0]==*(arr+0);//这一行的行地址其实就是我们的首地址

arr+1==arr[1]==*(arr+1);//arr+1代表第一行的行地址,取 * 就是代表第一行第0列的列地址。就是“5”的地址。

arr+2==arr[2]==*(arr+2);//同样的,代表了第二行第0列的列地址,就是“9”的地址。

**arr==*(*(arr+0)+0)==arr[0][0];

arr[1]+2==arr[1][2]==*(*(arr+1)+2);//第一行第二列的列地址,“6”的地址。

int (*p)[4]=arr;//一维数组指针和二维数组是完全等价的东西

p==arr,p+1==arr+1,p+2==arr+2;//p+1跳过了它所指向的元素(把(*p)遮起来,就会有int [4],说明跳过了一个)

**(p+1)==*(*(p+1)+0)==p[1][0];

      *(*p+1)==p[0][1];

二 多维数组和多维数组指针的关系

不管几维数组,在物理上都是一维的,在逻辑上都是多维的。

int arr[]==int *p;

int arr[][]==int *p[];

int arr[][][]==int *p[][];以此类推,循环往复。

三 指针与函数

一维数组指针作为函数的参数

函数内部想要操作数组(读或写)外部数组元素,将数组名传递给函数。

一维数组作为函数的形参,会被优化成指针变量。

二 二维数组作为函数的参数

二维数组传递方式和优化方式同上所述,只不过二维数组会被编译器优化成一维的数组指针。

通过指针的方式,可以实现在函数内部取改变函数。

四 函数内部返回值为指针类型

将函数内部的合法地址,通过返回值返回给函数外部使用。

注意:函数不要返回普通局部变量的地址。

static关键词是为了保证返回data的地址时data没有被释放空间,让指针得以访问一个合法的地址。

五 函数指针

函数名,原本是代表函数的入口地址。

函数指针的定义:本质是一个指针变量,只是该变量保存的值是函数的入口地址。

注意:函数指针变量判断大小< 或 >无意义;

函数指针变量可以赋值 p2=p1;

函数指针变量可以判断相等 p2==p3;

函数指针变量,可以尝试用typedef替换。

example:

int arr(int  a,int b){return a+b;};

void test ()

{

  int (*p)(int ,int )=NULL;

  typedef int (*sub_arr) (int ,int)=NULL;

  sub_arr p=arr;

}

六 函数指针作为函数的参数

目的:让算法功能多样化。

example:

设计一个算法,完成加减乘除。

int myadd (int a ,int b)

{ return a+b; }

int mydiv (int a,int b)

{ return a/b; }

int mysub (int a,int b)

{ return a-b; }

int mymul (int a,int b)

{ return a*b; }

//设计算法,操作上面的函数。

int mycalc(  int x, int y, int ( *func )( int ,int ) )

{

  return func(x,y);

}

void test()

{

  cout<<mycalc(10,20,myadd);//30。

  cout<<mycalc(10,20,mysub);//-10。

  cout<<mycalc(10,20,mymul);//200。

  cout<<mycalc(10,20,mydiv);//0。

}

Tips:

1.行加减是在数组的上下浮动,列加减是在数组同一行上左右浮动;

2.多维数组对应的数组指针都是n-1类型;

3.函数指针不要+1(是指向下一个函数的意思),无意义;

4.函数指针不要取值 * ,无意义。

c++学习7 指针与数组的更多相关文章

  1. C语言学习笔记--指针和数组的关系

    1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译 ...

  2. c语言学习笔记 - 指针和数组

    结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多. #include <stdio.h> int mai ...

  3. C语言学习笔记之成员数组和指针

    成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下.     单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...

  4. C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结

    1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...

  5. 《C语言深度解剖》学习笔记之指针和数组

    第4章 指针和数组 1. int *p=NULL 和 *p=NULL 有什么区别 int *p = NULL; 第一句代码的意思是:定义一个指针变量p,其指向的内存里面保存的是 int类型的数据:在定 ...

  6. 11-C语言指针&一维数组&字符串

    一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...

  7. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  8. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  9. 深入理解C语言中的指针与数组之指针篇(转载)

    前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...

  10. 浅谈C中的指针和数组(一)

    本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C ...

随机推荐

  1. (原创)Onlyoffice docs docker实例安装示例后,打开文档提示:文档下载失败

    不能使用localhost.请用本机ip访问

  2. 牛客算法进阶——树形dp

    1. 小G有一个大树(求树的重心) 删除该点后最大连通块的节点数最小 设f[x]表示以x为根的子树大小,那么删除x之后的各子树大小为f[to]和n-f[x] 求max(max(f[to]),n-f[x ...

  3. oralce sql 缓存查询及删除

    --缓存查询语句 V$SQLAREA 视图记录sql 执行情况(加载次数/用时/Id....) 常用字段 ADDRESS:SQL语句在SGA中的地址. 这两列被用于鉴别SQL语句,有时,两条不同的语句 ...

  4. QE11 / QE51N 界面太小问题

    修复后界面是,修复前常规页签中的数据只能显示4行,需要的note是 2639352 , SNOTE 进行打补丁就好  note是 2639352

  5. 批量获取title

    1 import requests 2 from bs4 import BeautifulSoup 3 import pandas as pd 4 from openpyxl import Workb ...

  6. AutoCAD专用卸载工具,完美彻底卸载清除干净AutoCAD各种残留注册表和文件。

    AutoCAD专用卸载工具,完全彻底卸载删除干净AutoCAD各种残留注册表和文件的方法和步骤.如何卸载AutoCAD呢?有很多同学想把AutoCAD卸载后重新安装,但是发现AutoCAD安装到一半就 ...

  7. 第13周 预习、实验与作业:Java网络编程

    编写一个网络程序,为了与其他网络程序通信,至少要知道对方的什么信息? IP地址 TCP与UDP协议有什么不同的呢?什么时候该选择哪种协议?HTTP使用的是TCP还是UDP?不重要的短信息传送之类的功能 ...

  8. CANas分析软件,DBC文件解析,CAN报文分析,仿CANoe曲线显示

    2023.01.01:增加对Kvaser的支持参考了CANoe写了下面的软件,主要用途是对报文的回放及曲线的分析. 1.CAN连接,支持周立功CAN.CANFD及PCAN 2.DBC解析与生成文件 打 ...

  9. WPF绑定(4)

    什么是绑定(Binding)? 在winform中, 我们常常会用到各种类型的赋值, 例如: button1.Text="Hello"; label.Text="Hell ...

  10. shadow-socks 服务器配置

    https://msd.misuland.com/pd/2884250034537239234 按照上述教程 使用python3 时 pip3 install 会报错 可以按照如下连接修复 https ...