1.函数
1.初识函数
#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类型元素的数组 */
...
}
方括号([ ])表明candy、code和states都是数组,方括号中的数字表明数组中的元素个数。要访问数组中的元素,通过使用数组下标数(也称为索引)表示数组中的各元素。数组元素的编号从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类型变量的值是整数,指针变量的值是地址。