指针

指针

  • 基本数据类型作为函数的参数是值传递,在函数中修改形参的值不会影响到外面实参的值;
void change(int value) // int value = 10;
{
     value = 55;
     printf("我被执行了\n");
}
  • 数组作为函数的参数是地址传递,如果是地址传递在函数中修改形参的值会影响到外面实参的值.
void change2(int values[])
{
    values[1] = 88;
    printf("我被执行了\n");
}

如何定义指针

    指针变量:
    数据类型 * 变量名称;

    数据类型:说明将来指针变量能够保存什么类型的变量的地址;
    注意: 指针变量是什么类型,那么将来就只能保存什么类型变量的地址;
    例如: 指针变量是int类型,那么将来就只能保存int类型变量的地址;
    * : 没有任何特殊含义,仅仅是为了标示这是一个指针变量
    变量名称 : 用于区分不同的变量
  • 指针就是专门用于保存地址的,指针在64位编译器下占8个字节;指针变量只能存储地址.
int *p; // 指针 , 在64位编译器下占用8个字节
p = # // 将num的地址存储到p这个指针中
//指针变量前的*号代表访问指针变量指向的那一块存储空间,*p == num
  • 例:自定义函数,要求输入三个值返回他们的和/差与平均值.
        int demo(int v1, int v2, int v3, int *p1, int *p2)
        {
            int sum = v1 + v2 + v3;
            *p1 = sum;
            int m = v1 - v2 - v3;
            *p2 = m;
            int average = sum / 3;
            return average;
        }
  • 指针的注意点:
    • 1.指针只能保存地址;
    • 2.同一个变量可以有多个指针指向它;
    • 3.指针的指向可以修改;
    • 4.不要访问野指针.(没有赋值的指针, 称之为野指针)
 int *p;
 int *p = NULL;//在实际开发中,若指针暂时未赋值,建议赋上NULL
 printf("%i\n", *p);
  • 5.指针类型是什么类型, 就只能指向什么类型的数据;

多级指针

    char **charValuePP;
    1.拷贝需要指向的变量的数据类型和变量名称
    2.在数据类型和变量名称之间加上一颗星
    3.修改变量名称
    char c = 'a';
    char *cp;
    cp = &c;
    char **cpp;
    cpp = &cp;
    char ***cppp;
    cppp = &cpp;
    printf("cppp = %c\n", ***cppp);
  • 多级指针的操作,最简单的方式,就是通过几颗星来存储,就通过几颗星来访问;
  • 还有一种方式就是画图,看图片中有几个箭头,有几个简单就用几颗星来访问.
        //*cp == c;
        //*cpp ==  cp;
        //**cpp == *(*cpp) == *cp == c
        printf("c = %c\n", c);
        printf("*cp = %c\n", *cp);
        printf("&c = %p\n", &c);
        printf("cp = %p\n", cp);
        printf("*cpp = %p\n", *cpp);
        printf("**cpp = %c\n", **cpp);
  • mac系统中的指针无论是什么类型, 几级指针都占用8个字节;
  • 指针为什么要分类型呢?因为当我们利用指针去取值的时候,系统就会自动根据指针的类型来确定应该取对少个字节中的值;
int  intValue = 1230;
char charValue = '1';
int *charValueP; // 定义的整型数据的指针变量
charValueP = &charValue; //将char型数据的变量地址传给整型数据类型的指针;
printf("%i\n", *charValueP); //取值时系统会按照int型数据取4个字节;
printf("%i\n",0b00000000000001001100111000110001);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值