C语言指针篇(下篇) CSDN花神生涯


函数指针数组

int Add(int x,int y)
{
	return x+y;
}
int Sub(int x,int y)
{
	return x-y;
}int Mul(int x,int y)
{
	return x*y;
}int Div(int x,int y)
{
	return x/y;
}
int main()
{
	int (*pa)(int,int)=Add;//此时除了存放Add函数,我们还想存放Sub,Mul,Div函数,怎么办呢,建立函数指针数组
	int (*parr[4])(int,int)={Add,Sub,Mul,Div}//建立函数指针的数组
//int* arr[5];注意区分指针数组和函数指针数组
	int i=0;
	for(i =0;i<4;i++)//循环调用
		{
		printf("%d\n",parr[i](2,3));
	}
}

指向函数指针数组的指针

int main()
{
	int (*pa)(int,int)=Add;//此时除了存放Add函数,我们还想存放Sub,Mul,Div函数,怎么办呢,建立函数指针数组
	//int (*parr)(int,int)函数指针
	int (*parr[4])(int,int)={Add,Sub,Mul,Div}//建立函数指针的数组
	int (*(*parrs)[4])(int,int)=&parr//建立指向函数指针数组的指针
	//parrs是一个数组指针,指针指向的数组有4个元素,每个元素的类型是一个函数指针int(*)(int,int)
]
	
	

回调函数

通过函数指针调用的函数

void print(char *str)//print叫回调函数,通过test函数调用的print 
{
	printf("hh\n");
}
void test(char *str)
{
	printf("test\n");
	p("biteaa")
}
int main()
{
	test(print);//通过函数调用另一个函数,输出hhbiteaa
	return 0;
}

总结篇

再次提醒:
数组名是首元素地址,除下面两个
👉size of(数组名)-表示整个数组
👉&数组名-表示整个数组
一维数组

int a[]={1,2,3,4};
printf("%d\n",size(a));//16计算的是数组空间总大小。单位是字节
printf("%d\n",size(a+0));//4/8 32位平台4个字节,64位平台8字节,此时的a不是单独在size of下,所以表示首元素地址
printf("%d\n",size(*a));//4.数组名表示首元素地址,*a就是首元素,整型的大小就是4
printf("%d\n",size(a+1));//4/8,a+1表示第二个元素地址
printf("%d\n",size(a[1]));//4第二个元素的大小
printf("%d\n",size(&a));//4/8取出的数组的地址,取出数组的大小4/8
printf("%d\n",size(*&a));//16,&a就是数组的地址,数组地址解引用访问的地址就是数组的的大小,相当于*和&互相抵消
printf("%d\n",size(&a+1));//4/8,虽然他跳过整个数组的地址,还是地址的大小
printf("%d\n",size(&a[0]));//4/8,第一个元素的地址
printf("%d\n",size(&a[0]+1));//4/8是第二个元素的地址

求字符数组空间大小

char arr[]={'a','b','c','d','e','f'};
printf("%d",sizeof(arr));//6 数组大小,6*1=6
printf("%d",sizeof(arr+0));//4/8,32位平台4个字节,64位平台8字节,此时的a不是单独在size of下,所以表示首元素地址
printf("%d",sizeof(*arr));//1,arr是首元素的地址,*arr就是首元素,首元素是字符大小的一个字节
printf("%d",sizeof(arr[1]));//1
printf("%d",sizeof(&arr));//4/8 数组的地址,地址的大小永远是4/8
printf("%d",sizeof($arr+1));//4/8虽然他跳过整个数组的地址,还是地址的大小
printf("%d",sizeof(&arr[0]+1));//4/8是第二个元素的地址

求字符数组不同情况下长度

char arr[]={'a','b','c','d','e','f'};
printf("%d",strlen(arr));//随机值,虽然目前为6,但strlen函数必须找到/0才结束
printf("%d",strlen(arr+0));//随机值,和上面写法相同
printf("%d",strlen(*arr));//报错,a的码是97,此时传过去,程序会从97向后访问,非法访问
printf("%d",strlen(arr[1]));//报错,b的码是98,此时传过去,程序会从98向后访问,非法访问
printf("%d",strlen(&arr));//随机值,虽然目前为6,但strlen函数必须找到/0才结束
printf("%d",strlen(&arr+1));//随机值,但与上面最随机值起码差6
printf("%d",strlen(&arr[0]+1));//随机值,但与最上面随机值起码差1

求字符串不同空间大小

char arr[]={"abcdef"};
printf("%d",sizeof(arr));//7 计算整个数组空间的大小,和/0无关
printf("%d",sizeof(arr+0));//4/8,32位平台4个字节,64位平台8字节,此时的a不是单独在size of下,所以arr+0表示首元素地址
printf("%d",sizeof(*arr));//1,arr是首元素的地址,*arr就是首元素,首元素是字符大小的一个字
printf("%d",sizeof(arr[1]));//1 第二个元素的大小
printf("%d",sizeof(&arr));//4/8,数组的地址
printf("%d",sizeof(&arr+1));//4/8虽然他跳过整个数组的地址,还是地址的大小
printf("%d",sizeof(&arr[0]+1));//4/8是第二个元素的地址,还是地址的大小

求字符串不同情况长度

char arr[]={"abcdef"};//abcdef\0
printf("%d",strlen(arr));//6,当碰上\0时,停止计算
printf("%d",strlen(arr+0));//6,首元素地址加0还是首元素地址
printf("%d",strlen(*arr));//报错,a的码是97,此时传过去,程序会从97向后访问空间,非法访问
printf("%d",strlen(arr[1]));//报错,b的码是98,此时传过去,程序会从98向后访问空间,非法访问
printf("%d",strlen(&arr));//6,会产生警告数组地址,数组类型char(*)[7]
printf("%d",strlen(&arr+1));//随机值,跳过整个数组,不知道何时有/0
printf("%d",strlen(&arr[0]+1));//5,第二个字符向后数,碰到\0停止,所以是5

求指针变量不同情况的空间大小

char *p="abcdef";
printf("%d",sizeof(p));//4/8,计算指针变量首元素地址的空间大小
printf("%d",sizeof(p+1));//4/8,得到是字符b的地址
printf("%d",sizeof(*p));//1,字符串的第一个字符a的大小
printf("%d",sizeof(p[0]));//1,p[0]==*(p+0),和*p意义一样
printf("%d",sizeof(&p));//4/8,第一个元素地址
printf("%d",sizeof(&p+1));//4/8,跳过这个字符串的地址
printf("%d",sizeof(&p[0]+1));4/8,第二个字符地址

求指针变量不同情况的长度

char *p="abcdef";
printf("%d",strlen(p));//6
printf("%d",strlen(p+1));//5
printf("%d",strlen(*p));//报错
printf("%d",strlen(p[0]));//报错
printf("%d",strlen(&p));//随即值,另有一块空间,&p将从新空间向后数字符,
printf("%d",strlen(&p+1));//随即值,另有一块空间,&p将从新空间+1向后数字符,
printf("%d",strlen(&p[0]+1));//5

二维数组不同情况下空间大小

int a[3][4]={ 0 };
printf("%d\n",sizeof(a));//48,3*4*4字节
printf("%d\n",sizeof(a[0][0]));//4
printf("%d\n",sizeof(a[0]));//16
printf("%d\n",sizeof(a[0]+1));//4,a[0]没有单独放在sizeof后,也没有&符号,所以a[0]表示第一行的首元素地址
printf("%d\n",sizeof(*(a[0]+1)));//4,第一行第二个元素
printf("%d\n",sizeof(a+1));//a是二维数组的数组名,没有单独放在sizeof后,也没有&符号,所以a是二维数组的首元素是它的第一行,a+1是第二行数组地址
printf("%d\n",sizeof(*(a+1)));//16 第二行大小
printf("%d\n",sizeof(&a[0]+1));//4 第二行地址大小
printf("%d\n",sizeof(*(&a[0])+1));//16 第二行地址解引用就是第二行大小
printf("%d\n",sizeof(*a));//16a是首元素地址,就是第一行,*a就是第一行的大小
printf("%d\n",sizeof(a[3]));//16,sizeof不参与运算,只是根据类型判断大小

花神博客生涯之C语言(指针篇)结束了哦~
接下来会持续更新(⊙o⊙)!
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值