标签:
1.C语言由函数组成,main函数又称主函数,是程序的入口.
1.1函数定义:
1.1.1 格式:
返回值类型 函数名(形式参数列表)
{
函数体
}
1.1.2 函数名: 不允许相同
1.1.3 参数注意点:
1.形式参数: 定义函数时函数名后面括号中的参数,简称形参
2.实际参数: 调用函数时传入的具体数据,简称实参
3.实参个数必须等于形参个数
4.函数体内部不能定义和形参一样的变量
5.如果是基本数据类型作为函数形参(int ,char等),是值传递,不会影响函数外实参的值
6.一个函数可以没有形参,也可以有无限多个形参
1 int sum(int x, int y) // x,y是形参,而且是基本数据类型,函数外的实参x,y还是5和4 2 { 3 // int x; // 错误,违反第4点 4 x = 1; 5 y = 2; 6 return x + y; 7 } 8 9 /* void sum() // 不允许与上面函数重名 10 { 11 12 } 13 */ 14 15int main() 16{ 17 int x = 5, y = 4; 18 sum(x, y); // 调用函数 19 // sum(x); // 错误,违反第3点 20 }
1.1.4 return的作用:
1.退出函数,只要遇到return,函数马上退出
2.返回一个具体值给函数调用者
1.1.5 返回值注意点:
1.void代表没有返回值,return可写可省略
2.如果没有明确返回值类型,默认是返回int类型
3.就算明确声明了返回值类型,也可以不返回任何值(会警告)
1 char test1() // 返回char类型 2 { 3 return ‘A‘; // 不写也可(会警告) 4 } 5 6 test2() // 默认返回int类型 7 { 8 return 0; 9 } 10 11 int test3() 12 { 13 return 0; // 不写也可(会警告) 14 } 15
1.1.6 特别注意:
1.函数不能嵌套定义,可以嵌套调用
2.函数不能重复定义,可以重复声明
3.如果只有函数的声明,没有函数的定义
3.1编译可以通过,因为编译器只检查语法合不合理,并不会检查函数有没有定义
3.2链接报错,因为链接的时候会检查函数是否定义
/* char test1() { int test2(int x) // 此处错误,嵌套定义 { return x+1; } return ‘a‘; } */ char test3() { int x = 18; test4(x); // 函数调用了另一函数,嵌套调用 return ‘d‘; } int teat4(int y) { return y-1; }
1.2 函数声明
如果要调用的函数在函数调用者后,要对函数进行声明(在调用者前)
1 int test(int x, int y); // 声明 2 int test(int, int); // 可以重复, 也可以省略形参名 3 4 int main() 5 { 6 test(3,4); // 调用 7 return 0; 8 } 9 10 int test(int x, int y) // 函数定义 11 { 12 return x + y; 13 }
1.3 函数调用
2. 函数与数组,指针
2.1 数组作为函数参数
2.1.1 可以省略数组元素个数
2.1.2 传递的是整个数组的地址,修改形参数组元素的值,会影响外面的实参数组
1 void test(int array[]) // 数组作为函数参数 2 { 3 array[0] = 100; // 修改数组元素值 4 } 5 6 int main() 7 { 8 int array[8] = {1,2,3,4,5,6,7,8}; 9 test(array); // 调用 传递地址,可以是数组名array,或者是数组第一个元素地 址&array[0] 10 printf("%d", array[0]); // 结果是100 11 return 0; 12 }
2.1.2 数组作为函数参数用指针形式传递
1 void test(int *p) 2 { 3 *p = 0; 4 *(p+1) = 5; 5 } 6 int main() 7 { 8 int array[8] = {1,2,3,4,5,6,7,8}; 9 test(array); 10 printf("%d, %d", array[1], array[0]); // 结果是5, 0 11 return 0; 12 }
2.2.1 指针作为函数参数
传递的地址,修改形参的值,会影响外面的实参
1 void test(int *p) 2 { 3 *p = 5; 4 } 5 int main() 6 { 7 int x = 1; 8 int *px; 9 px = &x; 10 test(px); 11 printf("%d", x); // 5 12 return 0; 13 }
2.2.2 返回指针的函数
1 char *test() // 返回类型指针 2 { 3 return "sfs"; 4 } 5 6 int main() 7 { 8 char *name = test(); 9 printf("%s", name); // 结果是sfs 10 return 0; 11 }
2.2.3 指向函数的指针
1 int sum(int a, int b) // 已有函数 2 { 3 return a+b; 4 } 5 int main() 6 { 7 int a1 = 1, b1 =11; 8 int a2 = 2, b2 = 3; 9 int s; 10 11 int (*p)(int, int); // 指针变量指向sum 12 p = sum; 13 14 s = sum(a1, b1); // 直接调用函数 15 printf("%d\n", s); 16 17 s = (*p)(a2, b2);// 间接调用函数 18 // s = p(a2, b2); // 也行 19 printf("%d", s); 20 return 0; 21 }
其实为函数提供了两种间接调用方法
标签:
原文地址:http://www.cnblogs.com/frew/p/4469932.html