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

【摘要 】

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

【正文】

预备知识

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

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

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

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

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


各指针声明方式

指针函数:

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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值