【摘要 】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