C语言函数,数组和指针学习笔记

1.函数

        1.初识函数

        什么是函数?函数(function)是完成特定任务的独立程序代码单元。
        为什么要使用函数?首先,使用函数可以省去编写重复代码的苦差。如果程序要多次完成某项任务,那么只需编写一个合适的函数,就可以在需要时使用这个函数,或者在不同的程序中使用该函数,就像许多程序中使用 putchar() 一样。其次,即使程序只完成某项任务一次,也值得使用函数。因 为函数让程序更加模块化,从而提高了程序代码的可读性,更方便后期修 改、完善。
        函数在使用前要先进行定义,一个函数由函数头和函数体两部分组成。
        函数头:返回值类型 函数名(指明类型的形参,可以为空)
        函数体:{
                               语句;
                       }
        下面定义一个打印40个星号的函数starbar(),废话不多说,直接上代码
#include <stdio.h>
#define WIDTH 40
void starbar(); /* 函数原型 */
int main()
{
starbar(); /* 使用函数 */
return 0;
}
void starbar(void) /* 定义函数 */
{
int count;
for (count = 1; count <= WIDTH; count++)
putchar('*');
putchar('\n');
}

        运行结果:****************************************

        其中返回值类型void的意思是该函数无返回值。

        函数声明:void starbar();    声明可以在定义前说明,这样做的好处是不管函数定义是在main函数前还是main函数后,都可以直接调用,只需将函数声明统一放在头文件中。

        分号表明这是在声明函数,不是定义函数。也就是说,这行声明了程序将使用一个名为starbar()、没有返回值、没有参数的函数,并告诉编译器在别处查找该函数的定义。

        函数调用:函数名(实参,可以没有);只要该函数成功定义,便可以使用。如:starbar();

        2.函数进阶

        1.函数的递归调用

        

​

#include <stdio.h>

int main()
{
	printf("快停下来\n");
	main();
    return 0;
}

​

        上述短短几行代码便实现了一个递归调用,由于没有设置终止条件,一直执行下去会陷入死循环。由此可见,在使用递归时一定要小心谨慎,不要忘记使用条件语句结束递归。

#include <string.h>

//int my_strlen(char* str)
//{
//	int count = 0;
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}

//递归的方法
int my_strlen(char* str)
{
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

int main()
{
	char arr[] = "helloworld";
	int len=my_strlen(arr);
	printf("%d\n",len);

	//模拟实现了一个strlen函数
	int len = my_strlen(arr);//arr是数组,数组传参,传过去的不是整个数组,而是第一个元素的地址
	printf("len = %d\n", len);
	return 0;
}

        2.指针函数

        返回值类型为指针的函数,本质上是一个函数。char* my_strcpy(char* dest, const char* src);

        3.函数指针

        char* (*pf)(char*, const char*);指向函数my_strcpy

        4.函数指针数组

        char* (*pfArr[4])(char*, const char*);存放4个my_strcpy函数的地址

        5.指向函数指针数组的指针

        int(*(*ppArr)[5])(int, int) = &pArr;

        6.数组指针

        int* (*pa)[10] = &arr;

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	int(*pa)[10] = &arr;
	//int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(*pa+i));//*pa == arr
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", (*pa)[i]);
	}
	return 0;
}

        7.指针数组

        int* arr[10];//存放指针的数组

int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int d = 40;
	int* arr[4] = { &a,&b,&c,&d };//数组元素是地址的值,总数为4
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		printf("%d ", *(arr[i]));//对每个数组元素使用解引用,可以得到a,b,c,d的值
	}
	return 0;
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	int* parr[] = { arr1,arr2,arr3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", *(parr[i] + j));
		}
		printf("\n");
	}
	return 0;
}

        parr[0]==arr1;

        arr1+0==&arr1[0];

        解引用得arr1[ ]的第一个元素1;

2.数组     

        数组由数据类型相同的一系列元素组成。需要使用数组 时,通过声明数组告诉编译器数组内含多少元素和这些元素的类型。编译 器根据这些信息正确地创建数组。普通变量可以使用的类型,数组元素都可 以用。考虑下面的数组声明:
/* 一些数组声明*/
int main(void)
{
float candy[365]; /* 内含365个float类型元素的数组 */
char code[12]; /*内含12个char类型元素的数组*/
int states[50]; /*内含50个int类型元素的数组 */
...
}

        方括号([ ])表明candycodestates都是数组,方括号中的数字表明数组中的元素个数。要访问数组中的元素,通过使用数组下标数(也称为索引)表示数组中的各元素。数组元素的编号从0开始,所以candy[0]表示candy数组的第1个元素,candy[364]表示第365个元素,也就是最后一个元素。

        初始化数组:int powers[8] = {1,2,4,6,8,16,32,64};

        数组名:数组首元素地址

        arr - 首元素地址

        &arr[0] - 首元素的地址

        &arr - 数组的地址

3.指针

        指针?什么是指针?从根本上看,指针(pointer)是一个值为内存地址的变量(或数据对象)。正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值是地址。

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值