C语言详解——指针下(指针与函数)

1.1指针作为函数的形参

函数调用时,主函数和被调函数之间数据的传递方式有三种:

(1)函数调用时将形参的值传给形参。

(2)函数调用返回时由被调函数通过return语句把函数值返回到主函数的调用处。

(3)通过全局变量来传递数据。

(4)利用指针作为参数在主调函数与被调函数之间传递数据。指针作为函数的形参时,可以实现函数之间多个数据的传递。

(1)函数的形参和实参均为指针变量:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void swap(int* p2, int* p3)
{
	int tmp;
	tmp= *p;
	*p = *p1;
	*p1 = tmp;
}
int main()
{
	int a = 2, b = 3;
	int* p = &a;
	int* p1 = &b;
	swap(p, p1);
	printf("%d %d", *p, *p1);
	return 0;
}

运行时内存空间的变化: 

(2) 函数的形参为指针变量,用变量的地址作为调用函数的实参:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void swap(int* p2, int* p3)
{
	int tmp;
	tmp= *p2;
	*p2 = *p3;
	*p3= tmp;
	printf("%d %d", *p2, *p3);
}
int main()
{
	int a = 2, b = 3;
	/*int* p = &a;
	int* p1 = &b;*/
	swap(&a, &b);
	return 0;
}

 在写代码时,很多同学都会犯这样一个错误:

void swap(int* p2, int* p3)
{
	int *tmp;
	tmp= p2;
	p2 = p3;
	p3= tmp;
	printf("%d %d", *p2, *p3);
}

这里呢,原本p2存的是a的地址假设为2000,p3存的是b的地址假设为2004,调用函数后,只是改变了指针p2和p3的值,即p2里的值变为了2004,p3里的值变为了2000,但a和b的值并未改变。 

 (3)数组的指针作为函数的参数:

(1)一维数组的指针作为函数的参数:

(1):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void swap(int* p, int size)
{
	int i = 0;
	printf("%d", p[i + 1]);
}
int main()
{
	int a[] = { 1,2,3,4,5 };
	int sz = sizeof(a) / sizeof(a[0]);
	swap(a,sz);
	return 0;
}

这里是把数组的首元素的地址传给函数,函数形参为指针,利用指针访问数组。 

(2)二维数组的指针作为函数的参数: 
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void swap(int* p[2], int size)
{
	int i = 0,j=0;
	printf("%d", *((p + i) + j));
}
int main()
{
	int a[][2] = { {1,2},{3,4},{5,6} };
	int sz = sizeof(a) / sizeof(a[0]);
	swap(a,sz);
	return 0;
}

这里是将第一行的地址传给了函数。 

 

 (2);

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void swap(int*p, int m,int n)
{
	int i = 0,j=0;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%5d", *(p + j + i * n));
		}
		printf("\n");
	}
}
int main()
{
	int a[2][3] = { 1,2,3,4,5,6 };
	swap(a,2,3);
	return 0;
}

1.2指针函数

所谓指针函数就是函数的类型为指针类型。

指针函数的定义形式为:

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

例如:

int * fun(int a,int b)

{函数体}

这里定义的fun是指针函数,要求函数返回一个整形的指针(整型变量的地址),即函数体中return语句中返回指针(地址)。

1.3函数指针

一个函数包括一组指针序列,存储在某一段内存中,这段内存空间的起始地址称为函数的入口地址,通过函数名可以得到这一地址,反过来,也可以通过该地址找到函数,故称函数的入口地址为函数指针。

调用函数的方式有两种,一是通过函数名调用,二是通过指向函数的指针变量来调用函数。

定义指向函数的指针变量的一般形式:

类型标识符 (*指针变量名)()

例如:

int (*p)(int a,int b)

{函数体}

通过函数名调用函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int swap(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
	return x * x;
}
int main()
{
	int a = 2, b = 3;
	/*int (*p)(int x, int y) = swap;*/
	int ret = swap(a, b);
	printf("%d", ret);
	return 0;
}
通过函数名调用函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int swap(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
	return x * x;
}
int main()
{
	int a = 2, b = 3;
	int (*p)(int x, int y) = swap;
	int ret = (*p)(a, b);
	printf("%d", ret);
	return 0;
}

两者结果都为9. 

指针与函数就讲到这里吧!咱们下次见!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值