zoukankan      html  css  js  c++  java
  • 【C语言】基础(九)指针

      ·

    指针

    指针:指针就是地址
    指针变量:存放变量地址的变量
    使用指针的目的:要通过指针能够找到被指的变量,或者说要通过指针间接访问被指的变量
    取变量;栈区

    int *p 指向int类型的指针
    %p 输出指针

    &取址符

    初始化
    int *p=NULL; 必须初始化

    定义时放*(*p=&a),赋值时不能放(p=&a )
    * 类型说明的作用
    间接访问指针指向内存的值的作用

    p=&a; 打印:p为地址,*p值为a




    void 类型的指针
    可以指向任何变量,但在使用时,需要进行强制类型转换之后才能使用

    void *p=&a;
    printf("%d",*(int*)p);



    指针大小:都为8个字节

    指针运算:只能加减、不能乘除

    p+n = p+n*sizeof(指向类型)



    指针访问数组

    1、数组名实际上就是一个指向该数组中第一个元素的指针
    2、在实际数组元素前面加一个&与 p=&a[1];
    3、在数组名后加偏移量,改变指向的数组元素

    *(p+n) = array[n] = *(array + n);
    p[0] == array[0];可以这样

    访问数组两种方式:
    下标法访问 数组名[下标] 指针[下标]




    const指针
    const int* p 指针指向的变量不可改变、可以修改指向、其指向内存被const修饰不可改变
    (const 在 * 左边,修饰int)
    int const* p 值不可变

    int *const p (const在*右边,修饰指针)指针不能改变指向

    const int *const p 只能初始化,都不能改


    const在星号左边:
    修饰的是指针指向的内存
    1.指针可以改变指向
    2.不可以通过指针改变其所指内存的值

    const在星号右边:
    修饰的是指针变量本身
    1.指针不可以改变指向
    2.可以通过指针改变其所指内存的值

    const在星号左右
    1.不可以改变指向
    2.不可以通过指针修改值


    注意:变量本身仍可以通过变量名去修改



    指针与字符串
    字符数组表示字符串
    用字符指针指向一个字符串表示,指向首地址

    char* str1 = "beijing" str1仅记录首地址
    beijing存在数据区(常量不能改),不能根据str1[1]=E;修改

    strcat不能用指针拼接。
    strcpy


    指针与函数

    指针变量作为函数参数:将指针变量以实参的形式传递给函数,进行的是地址的传递,所以可以在函数中改变实参的值

    数组名作为函数的实参和形参:进行地址传递

    函数的返回值是一个指针:函数的返回值类型必须定义为指针类型


    函数指针:指向函数的指针

    数据类型(*指针变量名) (形参列表)
    int (*p)(int a) --int(* )(int a)指向返回值为Int的函数指针
    int *p1(int a) -- (int*) (int a) 返回值为int*函数。函数名为p1
    括号不能省
    int *(*p2)(int*a,int*b) ----指向返回值为int*,参数为。。的函数指针

    指向函数的指针变量的说明:
    1、把函数首地址赋给指针变量时,直接写函数名即可,不用写括号和函数参数
    2、利用指针变量调用函数时,要写明函数的实际参数

    p=func1; p(20) == func1(20)
    //函数名就是函数的首地址
    //表示函数指针P指向func1

    指针访问二维数组

    int a[3][4];
    int (*p)[3][4];
    p=&a; *p == a;
    (*p)[1][1];
    p[0] ==*p;
    p[0][0][0]=a[0][0]
    p[0][1]=a[1];

    指针的指针(二维指针)
    如果一个指针变量存放的是又一个指针变量的地址,则称这个指针变量为指向指针的指针变量。

    int a;
    int *p=&a;
    int **p=&p;
    **p == a

    指向数组的指针
    定义:类型名称 (*指针名)[数组长度]
    如:int a[5]={1,1,1,1,1};int (*p)[5]=&a;
    定义时不加括号就成了指针数组,因为[]优先级比*高。
    数组指针定义时的数组长度,元素类型需与指向的数组相同

    int(*p)[5];指向数组长度为5的整型数组的指针
    char* (*p1)[10];指向类型为char* [10]的数组指针
    int *p2[10];一个数组 类型为int* [10]

    数组指针指向的是整个数组,不是单个元素
    数组指针加1,相当于p+sizeo(数组名)
    访问数组元素:a[0],*a,*(a+1),(*p)[0],p[0][0] (*p)==a, p[0]=a;


    指针(数组)
    如果数组元素都是指针变量,构成指针数组
    一般形式:类型名称 * 数组名[数组长度]
    int* a[10];每个元素都是int* 指针

  • 相关阅读:
    C# TcpServer调试工具
    C#调用百度AI开发平台
    MVC 身份证图像识别(调用dll)
    12.智能快递柜(其他功能)
    智能信报箱
    北斗卫星短信平台
    11.智能快递柜(用户寄件)
    WindowServer优化
    13.智能快递柜(对接流程)
    sublime text3 手动安装插件package control
  • 原文地址:https://www.cnblogs.com/yujiamin/p/7325362.html
Copyright © 2011-2022 走看看