一 函数的参数 1.值传递(是单向的) 2.地址传递 3.引用传递 二 在内存中形参和实参的存放位置是不同的,只有函数被调用的时候,形参才会被分配存储空间,在参数是以值传递的情况下,将实参的值赋给形参,形参只是实参的一个副本,不会影响到实参的值,等到函数调用完成以后,形参的存储空间将会被释放; 三 带默认参数值得函数(在c语言中这个方法是不能实现的,在c++中是可以的)如果是先写函数的声明,在后面在写函数的定义,函数定义中的函数头中参数是不能写默认值的 例如: #include <iostream>
using namespace std;
int foo(int a,int b=1,int c=2);
int main()
{
cout<<foo(3)<<" "<<foo(3,5)<<" "<<foo(3,5,7)<<endl;
return 0;
}
int foo(int a,int b,int c)
{
return a+b+c;
}
四 内联函数 使用关键字inline,写在函数返回类型的前面 使用inline的好处:函数调用是如果没有inline关键字,都是要先寻址找到这个函数后在是用,使用inline后就会省去寻址的时间 五 函数的重载 函数名相同,函数的参数不同(参数的类型不同,或者个数不同) 如果光是函数的返回值不同的话在不能叫做重载 例如: #include <iostream>
using namespace std;
int square(int i)
{
return i*i;
}
float square(float f)
{
return f*f;
}
double square(double d)
{
return d*d;
}
int main()
{
int a=2;
float b=0.5;
double c=3.1415926;
cout<<"The square of "<<a<<" is "<<square(a)<<endl;
cout<<"The square of "<<b<<" is "<<square(b)<<endl;
cout<<"The square of "<<c<<" is "<<square(c)<<endl;
return 0;
}
五 指针的定义:指针是一个存放变量的地址的变量 例如: char c; char *p=&c; 则指针变量中存放的是字符型变量c的地址 可以说:p指向字符变量c &是取地址符号 指针是一个四个字节的整形数据 六 指针变量 获得指针所指的变量的值使用取值符号:*,它的结合顺序是自右向左的 例如: #include <stdio.h>
int main()
{
int a=-123;
int *p;
int c;
p=&a;
c=*p+43;
printf("%d\n",c);
c=a+43;
printf("%d\n",c);
return 0;
}
结果: -80 -80 七 定义指针变量 格式:指针的类型 * 指针变量的名称 例如: char *p; int *q; float *r; long double *s; long int *t; 八 使用指针作为函数的参数(地址传递) 例如: #include <stdio.h>
//不能实现交换
void exchange1(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
//不能实现交换
void exchange2(int *a,int *b)
{
int *p;
p=a;
a=b;
b=p;
}
//能实现交换
void exchange3(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int a=5;
int b=7;
printf("交换前a=%d,b=%d\n",a,b);
exchange1(a,b);
printf("调用exchange1交换后a=%d,b=%d\n",a,b);
exchange2(&a,&b);
printf("调用exchange2交换后a=%d,b=%d\n",a,b);
exchange3(&a,&b);
printf("调用exchange3交换后a=%d,b=%d\n",a,b);
}
九 使用指针最为返回值 如:int *smaller(int *p1,int *p2); 例如: #include <stdio.h>
int * smaller(int *p1,int *p2)
{
return (*p1<*p2?p1:p2);
}
int main()
{
int a;
int b;
int *p;
printf("请输入a和b的值:");
scanf("%d%d",&a,&b);
p=smaller(&a,&b);
printf("%d和%d中较小的是:%d\n",a,b,*p);
return 0;
}
十 指向指针的指针变量 如:int **p; 例如: #include <stdio.h>
int main()
{
int a=58;
int *p;
int **q;
p=&a;
q=&p;
printf("%-3d\n",a);
printf("%-3d\n",*p);
printf("%-3d\n",**q);
return 0;
}
十一 数组和指针 一维数组的数组名就是就是一个这个数的首地址 数组名是个常量,不能改变 例如: 1. #include <stdio.h>
int main()
{
int a[5]={2,4,6,8,22};
int *p=a;
int i=0;
printf("%d %d\n",a[i],p[0]);
return 0;
}
2.
#include <stdio.h>
int main()
{
int a[10];
int i;
int *p=a;
for(i=0;i<10;i++)
{
printf("a[%d]=",i);
//scanf("%d",&a[i]);
scanf("%d",a+i);
//scanf("%d",p+i);
//scanf("%d",&p[i]);
}
printf("--------------------\n");
for(i=0;i<10;i++)
{
//printf("a[%d]=%d\n",i,a[i]);
//printf("a[%d]=%d\n",i,*(a+i));
printf("a[%d]=%d\n",i,p[i]);
//printf("a[%d]=%d\n",i,*(p+i));
}
return 0;
}
3. #include <stdio.h>
int main()
{
int x[10]={1,2,3,4,5,6,7,8,9,10};
int *p=&(x[5]);
printf("%d\n",*p);
p+=3;
printf("%d\n",*p);
p-=7;
printf("%d\n",*p);
p++;
printf("%d\n",*p);
p--;
printf("%d\n",*p);
}
十二 使用数组作为函数的参数 格式: int func1(int a[]);//声明是不用说明数组的具体长度 int func2(int *a);//一般使用这种格式 例如:#include <stdio.h>
#define SIZE 10
void input(int *a)
{
int i;
printf("请输入%d个数据:\n",SIZE);
for(i=0;i<SIZE;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
}
void output(int *a)
{
int i;
printf("数组元素为:\n");
for(i=0;i<SIZE;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}
}
int main()
{
int a[SIZE];
input(a);
output(a);
return 0;
}
|