c语言复习进阶 2)指针的进阶

指针的进阶

一维数组传参

结论
1:C语言中,当一维数组做函数参数时,编译器总是把它解析成一个指向其首元素的指针。

2:实际传递的数组大小与函数形参指定的数组大小没有关系。

正确写法1:

void test(int arr[])

解释说明:编译器把array解析成指向整形元素的指针,也就是数组的首地址,方括号中加不加指定数字都可以,因为编译器根本不看,因此最好不写,以免引起误解。

正确写法2:

void test(int *arr)

解释说明:这样写就更直接明了了,参数是指向整形元素的指针,而数组的名字又是首元素的地址,也印证了数组名是指针常量。

二维数组传参

一个二维数组可以不知道有多少行,但是必须知道有多少列,这样方便运算,所以设计函数时只能省略第一个[ ]中的数字。
正确写法:

void test1(int arr1[][5])
void test2(int arr2[3][5])
一级指针传参
#include<stdio.h>
void printf(int *p,int sz)
{
	int i=0;
	for(i=0;i<sz;i++)
	{
		printf("%d\n",*(p+i);
		}
int main()
{
	int arr[10]={1,2,3,4,5,6,7,8,9};
	int *p=arr;
	int sz=sizeof(arr)/sizeof(arr[0]);
	printf(p,sz);
	return 0;
}
函数指针

指向函数的指针,存放的是函数的地址
&函数名和函数名打印的都是函数的地址
例:

void Add(int x,int y)
{
	return x+y;
}
int main()
{
	int sum=0;
	int (*p)(int,int)=Add;
	sum=p(3,4);
	printf("%d\n",sum);
	return 0;
}
函数指针数组

存放函数指针的数组,类型为函数指针;
例,上面函数可以改成如下:

int (*p2[4])(int ,int);//函数指针数组
int (*(*p2)[4])(int,int);//指向函数指针数组的指针

函数指针数组
函数指针数组
在这里插入图片描述
指向函数指针数组的指针

函数指针数组的实现

#include<stdio.h>
void add(int a,int b)
{
	return a+b;
}
void sub(int a,int b)
{
	return a-b;
}
void mul(int a,int b)
{
	return a*b;
}
void div(int a,int b)
{
	return a/b;
}
int main()
{
	int x,y=0;
	int input=0;
	int ret=0;
	int (*parr[5])(int x,int y)={0,add,sub,mul,div};
	while(input)
	{
		printf("****************************\n");
		printf("*****1.add        2.sub*****\n");
		printf("*****3.mul        4.div*****\n");
		printf("****************************\n");
		scanf("%d\n",&input);
		if(input<=4&&input>=1)
		{
			printf(“请输入:”);
			scanf("%d %d",&x,&y);
			ret=(*p[input])(x,y);
			}
		else
			printf("输入有误,请重新输入“);
			printf("%d",ret);
		}
	return 0;
}

笔试题

#include <stdio.h> 
int main(int argc, char * argv[]) 
{ 
	int a[3][2] = { (0, 1), (2, 3), (4, 5) }; 
	int *p; p = a[0]; 
	printf( "%d", p[0]); 
	return 0;
}
 

逗号表达式从左往右依次计算,整个表达式的结果是最后一个表达式的值
所以这个二维数组的结果为:{1,3,5,0,0,0}
指针p指向该二维数组首地址a[0],也就是a[0][0], *p=&a[0][0],所以p[0]就是a[0],结果为1.

发布了34 篇原创文章 · 获赞 4 · 访问量 1755

猜你喜欢

转载自blog.csdn.net/qq_41181857/article/details/101111810