c++学习7 指针与数组

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

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

posted @ 2023-02-15 17:58  王博涵  阅读(27)  评论(0编辑  收藏  举报