您的位置:首页 > 其它

指针

2020-02-03 02:50 134 查看

文章目录

  • 指针变量作函数参数
  • 函数指针
  • 使用指针的基本原则
  • 动态分配内存
  • 指针的定义、初始化、解引用

    内存的编址

    • 每个字节有唯一的地址,内存地址按字节编号
    • 地址是一个无符号的整数,从0开始一次递增。地址常写成16进制。

    变量的寻址

    1. 直接寻址

      int a=0;
      scanf("%d",&a);   // & 取地址运算符
    2. 间接寻址

      通过指针类型存放变量的地址

      指针(Pointer)

      int a;
      int *pa = &a;
      printf("%p",&a);    //输出变量a的地址
      printf("%p",pa);    //同上

        基类型:指针变量指向的数据类型

      • 注意:变量的地址是常量,而变量的指针仍是变量。

      • 变量指针使用前必须初始化,若不明指向情况,请设置为NULL(NULL是值为0的宏,空指针不一定指向0地址)

    指针的解引用

    * 是间接寻址运算符,用于访问指针变量指向的变量的值

    int a = 0;
    int *pa = &a;
    *pa = 1;    //此时,a变量的值修改为1

    指针变量作函数参数

    基本类型:call by value 不可改变实参的值
    指针类型: call by reference 可以改变实参的值

    两数互换实例

    void Swap(int *x,int *y)
    {
    int temp;
    temp=*x;
    *x=*y;
    *y=temp;
    }
    void Swap(int *x,int *y)
    {
    int *ptemp;
    *ptemp=*x;      //ptemp未初始化,无法对其对应的储存空间赋值
    }
    void Swap(int *x,int *y)
    {
    int *ptemp;
    ptemp=x;
    x=y;
    y=ptemp;
    }  //仅仅交换了作为形参的指针变量的值,而实参变量的值并未改变

    函数指针

    定义

    指向函数的指针变量
    数据类型 (*指针函数名) (形参列表);

    int Fun(int a, int b);
    int (*f)(int, int);
    f=Fun;   //f指向函数Fun()
    int a,b;
    (*f)(a,b);   //通过函数指针调用函数

    函数指针变量储存的是函数在内存中的入口地址

    注意:

    int *f(int, int)
    是一个函数名为f,返回值是整型类型的函数

    主要应用

    编写实用性更强的函数

    编写实现升序、降序的函数

    void SelectionSort(int a[],int n,int (*compare)(int, int))        //高级的选择排序函数
    {
    int i, j, k;
    for(i=0;i<n-1;i++)
    {
    k=i;
    for(j=i+1;j<n;j++)
    {
    if((*compare)(a[i], a[k])) k=j;
    }
    if(k != i)
    {
    Swap(&a[k], &a[i]);
    }
    }
    }
    int Ascending(int a, int b)
    {
    return a<b;
    }
    int Decending(int a, int b)
    {
    return a>b;
    }

    计算函数的定积分

    float Integal(float (*f)(float),float a, float b)
    {
    float s,h;
    int n = 100,i;   //将区间分为100份
    s = ((*f)(a) + (*f)(b)) / 2;
    h = (b - a) / n;
    for (i=1; i<n; i++)
    {
    s = s + (*f)(a + i*h);
    }
    return s * h;
    }

    使用指针的基本原则

    1. 指针必须初始化
    2. 明确指针指向单元的内容-基类型
    3. 基类型唯一

    动态分配内存

    void* malloc(unsigned int size)
    申请在堆上分配内存

    • void* 指向任意类型
    • 使用时,使用(*type)强转
    • int *p; p = (*float)malloc(n*sizeof(int));
    • free(p) //释放
      ;
    • 问题:内存碎片,内存泄漏,野指针
    • 点赞
    • 收藏
    • 分享
    • 文章举报
    Diffident Ares 发布了15 篇原创文章 · 获赞 0 · 访问量 252 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: