首页 > 编程语言 >c++学习7 指针与数组

c++学习7 指针与数组

时间:2023-02-15 18:13:47浏览次数:35  
标签:arr 函数 int c++ 地址 数组 指针

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

二维数组名,代表的是第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.函数指针不要取值 * ,无意义。

标签:arr,函数,int,c++,地址,数组,指针
From: https://www.cnblogs.com/wangbohan/p/17124156.html

相关文章

  • 使用c++为Unreal做插件
    a.c++导出为library,他会导出所有数据。b.c++导出dll,他会导出指定的数据。一般用作各种插件为其他语言调用 步骤上大概分为2步,1.c++导出Dll,这里需要注意的是1.......
  • vue-day03——js中的循环、key值在循环的作用、数组,对象的检测与更新、input时间、v-m
    目录一、js的几种循环方式1.1v-for可以循环的变量1.2js的循环方式二、key值的解释三、数组,对象的检测与更新四、input事件五、v-model双向数据绑定六、过滤案例七、事件......
  • 遍历数组对象的方法
    for...of&for...in两者都可以用于遍历,不过forin遍历的是数组的索引(index),而forof遍历的是数组元素值(value)关于数组测试数据:constmenu=['tomato','egg','rice']......
  • 数组
    定义:数组类型定义了一组指定类型的元素序列//声明方式一typeDayTemperatures=array[1..24]ofInteger;//声明方式二varNames:array[1..3]ofstring;......
  • 【算法题--异或操作】找出数组中唯一没有重复的那个元素
    在我的博客上有一篇博文是提到C#里面的异或操作https://www.cnblogs.com/wphl-27/p/17104240.html有一个算法题是需要用到C#中的异或操作的,这道算法题就是获取一个数组中......
  • 指针
    指针也就是内存地址,指针变量是用来存放内存地址的变量(1)指针变量的声明​ 指针类型声明的一般格式为:Type指针类型名=^类型;​ New过程创建一个新的动态变量,并把指......
  • go 二维数组
    1.定义方式有两种1)先声明/定义,再赋值var数组名[大小][大小]类型funcmain(){//二维数组示例演示/*00000000100002......
  • Unreal Engine C++ :Character
    1.新建一个CharacterC++类默认包含:1//构造函数2ATheCharacter();34//开始5virtualvoidBeginPlay()override;67//更新8virtualvoidTick(f......
  • C++模板类中的静态成员变量的初始化
    变量声明:template<classT,enumEDeviceTypeg_eDeviceType>classILocalDeviceProtocolImpl:publicT{public:ILocalDevicePr......
  • c++中nan,inf
    nan:notanumber非数字注意事项:对负数开方sqrt(-1.0)、对负数求对数(log(-1.0))、0.0/0.0、0.0*inf、inf/inf、inf-inf这些操作都会得到nan。(0/0会产生操作异常;0.0/0.0......