有关指针,数组和函数的一些联系

当我们看见指针数组,数组指针还有函数指针...是不是感觉有点晕呐,但是为了高效率的写程序,清晰地理解和区分它们还是相当有必要的。

这里整理如下:

数组指针和指针数组

(1)  int (*p)[n];      //数组指针

      理解:a.()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个数组的长度是n;

                 b.在执行p+1的时候,p要跨过n个整形数据的长度。

int arr[10];
int (*ptr)[10]=&arr;    //ptr为指向数组的指针

(2)  int  *p[n];        //指针数组

      理解:[ ]优先级高于*,首先与p结合成为一个数组,再由int *说明这是一个整型指针数组,数组中有n个指                    针类型的数组元素 , 简单的来说,这个数组里存放了n个int*类型的变量 .

下面用图例来加强理解:  

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><img alt="" src="https://img-blog.csdn.net/20160426211710282?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" /></span>

下来我们来看一个类似的字符型指针数组代码:

<strong><span style="font-size:18px;"><span style="font-size:18px;"><strong></span></strong>
void bubble_sort(char *arr[ ],int sz)
{
	int i=0;
	int j=0;
	char *tmp=0;
	int flag=1;                             //表示有序
	for(i=0;i<sz-1;i++)
	{
		flag=1;
		for(j=0;j<sz-i-1;j++)            //冒泡排序多个字符串
		{
			if (strcmp(*(arr+j),*(arr+j+1))>0)
			{
                          tmp=*(arr+j);
			  *(arr+j)=*(arr+j+1);
			  *(arr+j+1)=tmp;
			  flag=0;
			}
		}
		if(flag==1)
			break;
	}
}</strong></span></span></strong>

这个程序就声明了一个字符型指针数组,每个元素都是char*类型的,用来存储字符串。存储字符串时存的是每个元素的首字符的地址,所以应该选用字符型指针,当然存储多个字符串就应当使用字符型指针数组了。

下来再让我们看看指针和函数的联系:

指针函数和函数指针

(1)指针函数:指针函数是指带有指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。

格式:类型标识符 *函数名(参数表)

例如:int *f(x,y);

理解:a.首先它是一个函数,这个函数的返回值呢是一个地址值,这也表明指针函数一定有函数返回值

      b.函数返回值必须用同类型的指针变量来接收,而且在主调函数中,函数返回值必须赋给同类型的指针         变量。

由于返回的是一个地址,所以类型说明符一般都是int

      c.函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。

(2)函数指针:是指向函数的指针变量,即本质是一个指针变量。

格式:类型说明符 (*函数名)(参数)

例如:int (*f) (int x);  //声明一个函数指针 

理解:a.这里的f已不能叫做函数名,而是一个指针的变量名;

      b.指向函数的指针包含了函数的地址,可以通过它来调用函数.

例如:void (*fptr)();

 (1)把函数的地址赋值给函数指针,可以采用下面两种形式:
     fptr=&Function;
     fptr=Function;
     
取地址运算符&不是必需的,因为单单一个函数标识符就表示了它的地址,如果是函数调用,还必须包含      一个圆括号括起来的参数列表。
    (2)
可以采用如下方式来通过指针调用函数:
        x=(*fptr)();
        

总之:

(1)主要的区别:一个是函数,一个是指针变量
(2)最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值