C++ 数组指针 指针数组 以及 函数指针 指针函数

【摘要 】ios

本文首先给出 指针相关概念 的预备知识, 即,指针的四个概念及其符号表示。然后,给出 各个 指针的 相关声明方式 。最后 ,本文给出 4 个 指针 相关概念的联合实例和输出。程序员

【正文】编程

预备知识数组

优先级关系:( ) > [ ] > * > +1;函数

指针函数:是一个函数,函数的返回值是一个指针 ;学习

函数指针:指针,指向一个函数 ;spa

指针数组:是一个数组,数组中的每一个元素是指针 ;指针

数组指针:指针,指向一个数组 ;xml


各指针声明方式内存

指针函数:

int *p ;

int *func ( int num , int length )

{

// do sth ;

};

p = func( numa , length_a );

表示函数的返回值是一个整型指针;

函数指针:

int (*p)( ) ;

int func ( int num , int length )

{

// do sth ;

};

p = &func ;

// p = func ; // 也是可行的;

// 取地址运算符&不是必需的,函数标识符就表示了它的地址;


// 下面给出函数指针的调用方式

  • int x = *p( numa , length_a );
  • int x = p( numa , length_a ); // 也是可行的;

表示指针指向函数,可直接调用指针实现函数功能;

指针数组:

int *p[ 10 ] ;

int vec[10] = {1,2,3,4,5} ;

p[0] = vec ;

/*

【查看输出】

p[0] = addr(vec);

*p[0] = vec[0];

*/

指针指向 1 个 10 维的整型数组;

【注】

// 高维数组,字符串数组

int arr[ ][3] = {{1,4,7},{3,5,9}};

/* 必定要引发重视,下面这段代码是会报错的,由于,程序员这个时候

往内存未分配空间的指针存入了矩阵数据,是不可实现分配。

int *mat[ ] = {{12,14,72},{31,54,39},{1,4,7},{3,5,9}};

*/

p[1] = *arr;

p[2] = *arr+1;

// 指针不受数组的维数增减限制

/*

【查看输出】

p[1] = p[2]-1;

p[2][0] = 4;

p[2][3] = 5;

*/

数组指针:

int ( *p ) [ 10 ] ;

int arr[3][10] = {1,2,3,4,5} ;

p = arr;

1*10 的数组中,每个元素都是指针;

编程实例:

#include <iostream>

int get_max(int (&arr)[3][4])
{
int mylength = sizeof(arr)/sizeof(int); 
// 1. 这个地方既不是 &arr(当你认为 传入的是一个 3*4 的地址的时候,它不是!), 也不是 *arr(当你认为传入的是 原来主函数中的 arr 数组的时候,它不是!),它是 arr自己,为何呢;去查!
// 2. 这个地方在 运行到此处时候,有以下图,数据类型的展现,逻辑上是说不过去的!

// 具体是由于 引入的是引用仍是地址,最终计算的是否是不会依据 watch 来表现数据,咱们都须要逐渐学习
int n = sizeof(arr[0])/sizeof(int);
int m = mylength/n;
int temp = arr[0][0];
for ( int i = 0; i < m ; i++ )
{
for ( int j = 0; j < n ; j++ )

if( arr[i][j] >= temp )
temp = arr[i][j];
}
}
return temp;
};

int *get_min(int (&arr)[3][4])
{
int p,q;
int mylength = sizeof(arr)/sizeof(int);
int n = sizeof(arr[0])/sizeof(int);
int m = mylength/n;
int temp = arr[0][0];
for ( int i = 0; i < m ; i++ )
{
for ( int j = 0; j < n ; j++ )

if( arr[i][j] <= temp )
{
temp = arr[i][j];
p = i;
q = j;
}
}
}
return &arr[p][q];
};

int main()
{
int arr[3][4];
int *p_a[3];   // pointer_array
int (*a_p)[4]; // array_pointer

for(int i=0;i<3;i++)
{
for (int j=0;j<4;j++)
{
arr[i][j] = 10*(i+1)+1+2*j;
p_a[i]=arr[i];
}
a_p = arr;
}

// 打印 数组 指针数组 以及 数组指针
std::cout<<"*********************************************"<<std::endl;
std::cout<<"打印 指针数组"<<std::endl;
for(i=0;i<3;i++)
{
for(int j=0;j<4;j++)
// 这里 **p_a 与 *p_a[0] 的大小是一致的
std::cout<<*(p_a[i]+j)<<'\t';
std::cout<<std::endl;
}
std::cout<<"*********************************************"<<std::endl;
std::cout<<"打印 数组指针"<<std::endl;
for(i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
std::cout<<(*(a_p+i))[j]<<'\t';
}
std::cout<<std::endl;
}

int (*p_f)(int (&a)[3][4]); // pointer_func
// 下面 三种 指针函数 的声明方式 都是 可以 实现的
// p_f = get_max;
// *p_f = get_max;
//  p_f = &get_max;
p_f = &get_max;

std::cout<<"*********************************************"<<std::endl;
int maxnum = p_f(arr);
std::cout<<"指针函数 成功实现 , ";
std::cout<<"maxnum is "<<maxnum<<" ! ! !"<<std::endl;

int *f_p = get_min(arr);
std::cout<<"函数指针 成功实现 , ";
std::cout<<"minnum is "<<*f_p<<" ! ! !"<<std::endl;
// int *p_max; // pointer_max
// p_max = f_p(arr);
std::cout<<"*********************************************"<<std::endl;

return 0;
}

源码输出:

********************************************* 打印 指针数组 11      13      15      17 21      23      25      27 31      33      35      37 ********************************************* 打印 数组指针 11      13      15      17 21      23      25      27 31      33      35      37 ********************************************* 指针函数 成功实现 , maxnum is 37 ! ! ! 函数指针 成功实现 , minnum is 11 ! ! ! ********************************************* Press any key to continue