c语言函数与指针
//本文有待补充。
一、函数
1.函数的定义
如果程序的逻辑比较复杂、代码量比较大,或者重复性功能比较多,那么全部写在主函数里就会显得十分冗长和杂乱。为了使代码更加简洁、思路更加清晰,C语言提供了”函数“。函数是一个实现一定功能的语句的集合,并在需要时可以反复调用而不必每次都重新写一遍。像math.h头文件下面的sin()、pow()等数学函数就是系统已经帮其实现好功能的、用户可以直接使用的函数。
返回类型 函数名称(参数类型 参数){
函数主体
}
2.理解函数
#include<stdio.h>
int main(){
int n,d;
scanf("%d %d",&n,&d);
int x=0;
if(n<0)n=-n;
while(n){
int a=n%10;
if(a==d)x++;
n/=10;
}
printf("%d",x);
return 0;
}
#include <stdio.h>
int Count_Digit ( const int N, const int D );
int main()
{
int N, D;
scanf("%d %d", &N, &D);
printf("%d\n", Count_Digit(N, D));
return 0;
}
int Count_Digit ( const int N, const int D ){
int x=0,n=N;
if(n<0)n=-n;
while(n){
int a=n%10;
if(a==D)x++;
n=n/10;
}
return x;
}
#include <stdio.h>
int CountDigit( int number, int digit );
int main()
{
int number, digit;
scanf("%d %d", &number, &digit);
printf("Number of digit %d in %d: %d\n", digit, number, CountDigit(number, digit));
return 0;
}
int CountDigit( int number, int digit ){
int x=0;
if(number<0)number=-number;
if(number==0)return 1;
while(number){
int a=number%10;
if(a==digit)x++;
number=number/10;
}
return x;
}
我们观察上面三个代码,都实现了同样的结果,只是表达方式不同,第一个代码和另外两个代码就是一般代码和函数代码的区别,做函数题的时候只需要写好函数部分就行。
然后第二个代码和第三个的区别是const(const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。)
到这里,函数主体和我们平时在主函数里写的代码并没有什么区别,我们只需要注意除函数主体以外的外壳就行。
如果函数返回类型是void,一般需要printf输出结果(万一是全局变量或指针或数组),否则是return。
对于递归函数,其实就是先判断特殊情况,然后又调用本函数(参数应作相应的改变)得到其它结果。
3.细节问题
(1)如果需要使用到一些写好的函数,注意看主函数有没有对应的头文件,否则,老老实实按照思路去写。
(2)一维数组不需要写长度,二维数组后面一个需要写。
void change(int a[],int b[][5]){
}
二、指针
1.一般情况
在函数里面的指针,其实就是多了个’*‘而已,和一般函数没有太大区别。
2.什么时候需要加或减*
3.指针与数组
如果指针对应的传入是数组或字符串(字符串以’\0'结尾,如果头文件没有string.h的头文件,写函数主体时可以用这个条件来循环,同时注意有些时候要加上'\0'),那么*p=a[0](*p=&a[0],这里的’&‘可以忽略),如果p++(*p=a[1]),同样的(*(p+i)=a[i])。
如果是(*p)[n],其实就是p[n][n],也就是指针和数组是一样的,如下,两个代码皆可。
6-20冒泡排序
8
7 3 66 3 -5 22 -77 2
输出样例:
-77 -5 2 3 3 7 22 66
#include <stdio.h>
void bubble (int a[ ], int n);
int main(void)
{
int n, a[10];
int i;
scanf("%d", &n);
for (i=0; i<n;i++)
scanf("%d",&a[i]);
bubble(a,n);
for (i=0; i<n; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
void bubble (int a[ ], int n){
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(a[j]>a[j+1]){
int t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
}
#include <stdio.h>
void bubble (int *a, int n);
int main(void)
{
int n, a[10];
int i;
scanf("%d", &n);
for (i=0; i<n;i++)
scanf("%d",&a[i]);
bubble(a,n);
for (i=0; i<n; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
void bubble (int *a, int n){
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(a[j]>a[j+1]){
int t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
}