数组与指针

数组的一些小常识

  1. 数组名代表数组首元素的地址,但有两种情况例外 &arr与sizeof(arr),表示着整个数组的长度
  2. 二维数组名代表着二位数组第一行的地址,第一行的地址是一维数组的地址,举个例子
int arr[3][4] = { 1,2,3,9,3,2,9,1,5,4,6,7 };
//*arr 相当于数组名 ,即第一行的首元素地址(1的地址),*(arr+1)表示第二行的首元素地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AcCWcRWP-1688463860442)(C:\Users\22724\AppData\Roaming\Typora\typora-user-images\image-20230701175304288.png)]

指针数组

指针数组其实是数组,里面存放的是指针。

int* arr[3] 表示存放着3个类型为 int * 的 数据的 数组,举个例子

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main(void)
{
	int a[2] = { 1,2 };
	int b[2] = { 0,1 };
	int c[2] = { 1,2 };
	int* arr[3] = { a,b,c };
	printf("%d", *arr[2]);//打印的结果是c里面的1,  arr[2]表示数组c的首元素地址
	
}


数组指针

数组指针表示的是指向数组的指针。二维数组的数组指针存放着二维数组第一行的数组的地址

int (*p)[10];

数组指针往往用于二维数组在函数中的传递。举个例子:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void print(int (*p)[4], int x, int y)//*(p+i)相当于于p[i]   *p相当于p[]
{
	for (int a = 0; a < x; ++a)
	{
		for (int b = 0; b < y; ++b)
		{
			printf("%d ", *(*(p+a)+b));
		}
		printf("\n"); 
	}
}
int main(void)
{
	
	int arr[3][4] = { 1,2,3,9,3,0,9,1,5,4,6,7 };
	print(arr, 3, 4);//二维数组的arr表示第一行的所有元素,它是个一维数组的地址,arr[0]表示第一行的首元素地址
	
}


函数指针

函数指针是用来接收函数名的指针

Add (int x , int y)是个加法函数

int (*ptr)(in x , int y) = Add; 指针的类型 int( * ) (int , int )

则ptr里面保存着Add的地址,因此可以用ptr或者ptr*直接调用Add,

#define _CRT_SECURE_NO_WARNINGS 1
函数指针解决代码冗余度
#include<stdio.h>

void mnue()
{
	printf("0.加法     1.减法    2.乘法  3.退出\n");

}

int Add(int x, int y)
{
	return x + y;
}

int Sub(int x, int y)
{
	return x - y;
}
int Muti(int x, int y)
{
	return x - y;
}

void calu(int(*ptr)(int x,int y))//将函数名传进来,用int(*)(int x , int y)类型的函数指针来接受
{
	printf("请输入两个数\n");
	int x;
	int y;
	scanf("%d %d", &x, &y);
	int ret = ptr(x, y);
	printf("%d", ret);
}



int main(void)
{

	mnue();
	int input;
	scanf("%d", &input);

	
	do {
		switch (input)
		{
		case 1:
			calu(Add);
			break;
		case 2:
			calu(Sub);
			break;
		case 3:
			calu(Muti);
			break;
		case 4:
			break;
		default:
			break;
		}



	} while (input);



}

函数指针数组

函数指针数组其实是数组,里面存放着函数指针

int(*arr[3])(int x, int y) = {Add,Sub,Muti};

那么函数指针数组的指针是什么呢?

首先这个指针的类型必须和数组里面元素的指针类型相同, 那么类型为int ( * )(int x , int y),数组的地址,是一维数组的全部元素,那么就是(*parr)[3].

则这个指针为int(* (*)parr[3] )(int x , int y) = &arr;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值