黑马程序员——C语言基础2

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一 函数的参数
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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值