函数知识点与习题-创新互联

定义函数

返回类型 函数名(参数1, 参数2…)
{
//函数体

创新互联建站是由多位在大型网络公司、广告设计公司的优秀设计人员和策划人员组成的一个具有丰富经验的团队,其中包括网站策划、网页美工、网站程序员、网页设计师、平面广告设计师、网络营销人员及形象策划。承接:网站设计制作、做网站、网站改版、网页设计制作、网站建设与维护、网络推广、数据库开发,以高性价比制作企业网站、行业门户平台等全方位的服务。
(返回值, 除了void类型都要有返回值, 跟返回类型对应)
;

}

int main()
{return 0; //向操作系统返回0, 代表程序正常结束
}
自定义函数
如果自己写的这个函数写在main函数前面, 就可以不写函数声明
如果写在main函数后面的话, 必须在main函数前面写他的声明

函数声明 → 函数类型 函数名(参数类型 (变量名), 参数类型 (变量名))


#include//add函数在main后面, 所以需要加一个函数声明
int add(int, int); //参数的名字可以省略

int main()
{int a = 5, b = 6;
    printf("%d", add(a, b));
    return 0;
}

int add(int a, int b)
{return a + b;
}



#include//不写声明
int add(int a, int b)
{return a + b;
}

int main()
{int a = 5, b = 6;
    printf("%d", add(a, b));
    return 0;
}
传值调用和传址调用
#include//传值调用
void swap(int a, int b) //a 和 b是形式参数
{int t = a;
    a = b;
    b = t;
}
int main()
{int a = 3, b = 4;

    printf("交换前a = %d b = %d\n", a, b);

    swap(a, b); // a 和 b是实际参数

    printf("交换后a = %d b = %d\n", a, b);
    return 0;
}



#includevoid hahaha()
{printf("hahaha");
}
//传址调用
void swap(int &a, int &b) //a 和 b是形式参数
{int p = a;
    a = b;
    b = p;
    hahaha();
}
int main()
{int a = 3, b = 4;

    printf("交换前a = %d b = %d\n", a, b);

    swap(a, b); // a 和 b是实际参数

    printf("交换后a = %d b = %d\n", a, b);
    return 0;
}



传值调用: 只是把swap(a, b) 里面a和b的 值 copy 了一份给了swap(int a, int b)里面的a 和 b
函数调用的时候传的参数 如swap(a, b); 里面的a 和 b 为实际参数
void swap(int a, int b) 里面的a 和 b为形式参数, a 和 b是定义在 swap这个栈空间里面新开的变量,只是把原来swap(a, b)里面a和b的值赋值给了它, 因此如果只是在swap(int a, int b)函数里面对a和b进行操作的话, 不会影响到main函数栈空间里面的a和b, 在执行完swap函数之后会销毁
swap(int *a, int *b) 也只是把a和b的地址作为参数传进来了,而并没有真正对a和b进行操作


传址调用: void swap(int &a, int &b) &相当于直接把a和b定义在内存中的地址给到了这个函数, 这个函数的操作会对内存中真正的a和b进行操作 
全局变量
全局变量定义在堆里面的, 如果对全局变量进行修改的话, 是会真正产生影响的

#includeint n = 10;
void add() 
{n++; //真正对堆里面的n进行操作
}


int main()
{add();

    printf("%d", n);
    return 0;
}


//局部变量优先 → 仍然是对栈中的n进行操作, 不会对全局变量定义在堆中的n有影响

#includeint n = 10;
void add(int n) //实际影响的是栈里面的n, 而不是上面的定义在堆里面的n 
{n++;
}

int main()
{add();

    printf("%d", n);
    return 0;
}




值为10的时候: n是定义在栈里面(局部变量) → 传值调用 / 局部变量优先, int add(int n) 跟 全局变量的n重名了

值为11的时候: 前提是n为全局变量, add的参数不是n

报错的情况: 前提是n为全局变量, add的参数不是n + 全局变量n定义在add函数后面

数组作为函数参数
//如果传的是数组的话, 对数组元素进行操作会直接改变数组的值
#includevoid change(int q[]) // int* q
{q[1] = 2;
    q[2] = 4;
}
int main()
{int q[5] = {0};

    change();
    printf("%d %d", q[1], q[2]);
    return 0;
}
递推 递归 6-1 sdut-C语言实验-计算组合数
int fun(int n, int m)
{//递归边界
    if(m == 0 || n == 1 || m == n) return 1;

    return fun(n - 1, m - 1) + fun(n - 1, m);
}
6-2 sdut-C语言实验- n个数的排序
void sort(int *p, int n)
{for(int i = 1; i<= n - 1; i++)
    {for(int j = 0; j< n - i; j++)
        {if(p[j] >p[j + 1])
            {int t = p[j];
                p[j] = p[j + 1];
                p[j + 1] = t;
            }
        }
    }
}


void sort(int *p, int n)
{for(int i = 1; i<= n - 1; i++)
    {for(int j = 0; j< n - i; j++)
        {if(*(p + j) >*(p + j + 1))
            {int t = *(p + j);
                *(p + j) = *(p + j + 1);
                *(p + j + 1) = t;
            }
        }
    }
}
6-3 sdut- C语言实验——矩阵下三角元素之和

上下三角都是以主对角线为界限
下三角 → j<= i

int f(int (*p)[10], int n)
{int sum  = 0;
    for (int i = 0; i< n; i++)
    {for(int j = 0; j< n; j++)
        {if(j<= i) sum += p[i][j];
        }
    }
    return sum;
}
6-4 sdut-C语言实验- N
long long int f(long long int n)
{long long ans = 1;
    for(int i = 1; i<= n; i++)
    {ans *= i;
    }
    return ans;
}
6-5 sdut-C语言实验-使用函数验证哥德巴赫猜想
int isPrime(int x)

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:函数知识点与习题-创新互联
标题路径:http://ybzwz.com/article/gocos.html