1. 调用函数
数据类型 函数名称 (参数){
pass;
return (表达式)
}
- 函数得写在
main
之前,先说明在调用 - 例1,求 x n x^n xn
#include <stdio.h>
#include <string.h>
double power(double x, int n){
double res=x;
for (int i=0; i<n; i++){
res *= res;
}
return res;
}
int main(int argc, char *argv[])
{
double res = power(1.3, 2);
printf("%f\n", res);
return -1;
}
2. 函数的说明
- 函数可以放在主函数之后,但是需要在主函数之前说明函数
- 可以省略形参但是不能省略类型
- 例2:
#include <stdio.h>
#include <string.h>
double power(double, int); //第一种方式声明
double power(double x, int n); //第二种方式声明
double power(double y, int m); //第三种方式声明
int main(int argc, char *argv[])
{
double res = power(1.3, 2);
printf("%f\n", res);
return -1;
}
double power(double x, int n){
double res=x;
for (int i=0; i<n; i++){
res *= res;
}
return res;
}
2. 传参
2.1 全局变量
- 在代码的任何地方都可以直接调用
- 例3
#include <stdio.h>
#include <string.h>
double x = 2;
int n = 3;
double power(){
double res=x;
for (int i=0; i<n; i++){
res *= res;
}
return res;
}
int main(int argc, char *argv[])
{
double res = power();
printf("%f\n", res);
return -1;
}
2.2 赋值传递
- 在形参中赋值是局部变量不是全局变量
- 参考例1
2.3 地址传递
- 按地址传递,实参为变量的地址,而形参为同类型指针
- 被调用函数中对形参的操作。将直接改变实参的值
#include <stdio.h>
#include <string.h>
void swap(int *x, int *y );
int main(int argc, char *argv[])
{
int a = 1, b = 2;
printf("a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return -1;
}
void swap(int *x, int *y){
int t = *x;
*x = *y;
*y = t;
}
- 但是需要注意的是,对字符串来说
char *s="str"
是不能作为参数并改变的,因为这是字符串常量,因此我们需要用字符串数组来代替char s[]="str";
- 统计小写字母个数
#include <stdio.h>
int str_fun(const char *p);
int main(int argc, char *argv[])
{
char s[] = "HelloWord!";
int n;
n = str_fun(s);
printf("n=%d\n", n);
return 0;
}
int str_fun(const char *p){
int num = 0;
while (*p!='\0'){// while (*p)
if (*p <= 'z' && *p >='a')
num++;
p++;
}
return num;
}
- 将小写字母改成大写字母
#include <stdio.h>
int str_fun(char *p);
int main(int argc, char *argv[])
{
char s[] = "HelloWord!";
int n;
n = str_fun(s);
printf("n=%d s=%s\n", n, s);
return 0;
}
int str_fun(char *p){
int num = 0;
while (*p!='\0'){// while (*p)
if (*p <= 'z' && *p >='a'){
num++;
*p -= 32;
}
p++;
}
return num;
}
2.4 数组传参
- 全局变量
- 地址传递方式
- 举例:计算一个一维整型数组求和
//错误的写法
#include <stdio.h>
int array_sum(int a[]);
int main(int argc, char *argv[])
{
int a[] = {1, 2, 3, 4, 5, 6};
int sum = 0;
sum = array_sum(a);
return 0;
}
int array_sum(int a[]){ //这里是声明了一个数组,传参传进来的是一个数组是不成立的。
//int a[] = a;相当于把一个数组名赋给了一个数组
//这句话其实相当于 int * a = a;指针存地址
int ret = 0;
int i;
for (i = 0; i<sizeof(a)/sizeof(int); i++)
ret += a[i];
}
正确的写法
#include <stdio.h>
int array_sum(int *a, int length);
int main(int argc, char *argv[])
{
int a[] = {1, 2, 3, 4, 5, 6};
int sum = 0, length = sizeof(a)/sizeof(int);
sum = array_sum(a, length);
printf("%d\n", sum);
return 0;
}
//int array_sum(int a[], int length){
int array_sum(int *a, int length){
int ret = 0;
int i;
for (i = 0; i<length; i++)
ret += a[i];
return ret;
}
3. main函数
main函数
中argc
指的是输入的参数数量,argv
指的是输入的参数,可以通过循环从终端取参数
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i;
printf("输入的参数数量 argc=%d\n", argc);
printf("输入的参数是:\n");
for(i=0; i<argc; i++){
printf("%s\n", argv[i]);
}
return -1;
}
在终端输入
./bit abc def
返回
输入的参数数量(argc)=3
输入的参数(argv):
./bit
abc
def