C语言入门(十七)之指针的基本概念

如何定义指针变量

     普通变量:
     数据类型 变量名称;
     
     指针变量:
     数据类型 * 变量名称;
     
     数据类型 : 说明将来指针变量能够保存什么类型的变量的地址
               注意: 指针变量是什么类型, 那么将来就只能保存什么类型变量的地址,
               例如: 指针变量是int类型, 那么将来就只能保存int类型变量的地址
     * : 没有任何特殊含义, 仅仅是为了标示这是一个指针变量
     变量名称 : 用于区分不同的变量

    int num; // 普通变量
    num = 10;
    
    int *p; // 指针 , 在64位编译器下占用8个字节
    // 千万注意: 指针变量只能存储地址
    p = # // 将num的地址存储到p这个指针中
    
    // p == &num
    printf("num = %p\n", &num);
    printf("p = %p\n", p);
    
    // 指针变量前的*号代表访问指针变量指向的那一块存储空间
    // *p == num
    *p = 55;
    printf("num = %i\n", *p);
/ 指针就是专门用于保存地址的
void change3(int *p) // 用什么接收地址?   指针 = 0ffc13  int *p = #
{
    *p = 55;
    printf("哥被执行了\n");
}

1、交换两个变量的值

#include <stdio.h>


void swap(int *v1, int *v2)
// int *v1 = &a, int *v2 = &b; v1 = 0ffc13 v2 = 0ffc9
// *v1 == a  *v2 == b
{
    int temp = *v1; // int temp = 0ffc13
    *v1 = *v2;
    *v2 = temp;
}

int main(int argc, const char * argv[]) {
    // 定义一个函数交换两个变量的值
    int a = 10; // 0ffc13
    int b = 5; // offc9
    printf("交换前:a = %i, b = %i\n", a, b);
//    int temp = a;
//    a = b;
//    b = temp;
    swap(&a, &b);
    printf("交换后:a = %i, b = %i\n", a, b);
    return 0;
}

2、定义一个函数, 传递三个值, 返回这三个值得和,差,平局值

#include <stdio.h>
//int demo(int v1, int v2, int v3);
int demo(int v1, int v2, int v3, int *p1, int *p2);

int main(int argc, const char * argv[]) {
    // 要求定义一个函数, 传递三个值, 返回这三个值得和,差,平局值
    int a = 10;
    int b = 20;
    int c = 30;
//    int res =  demo(a , b , c);
//    printf("res = %i\n", res);
    
    // 定义三个变量用于保存计算结果
    int res1 = 0; // 和
    int res2 = 0; // 差
//    int res3 = 0; // 平局值
    
    // *p1 == res1 *p2 == res2
    // 我们想要的就是调用完函数之后, 和差平均值对应的变量都被"修改"为对应的值
   int res3 = demo(a, b, c, &res1, &res2);
    
    printf("和 = %i, 差 = %i, 平均值 = %i\n", res1, res2, res3);
    
    return 0;
}

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;
    
    /*
    // 因为返回的是一个逗号表达式, 而逗号表达式的值是最后一个表达式的值, 所有返回的是average
//    return sum, m, average;
    */
    
    /*
    // return 连个作用 1.返回值给调用者 2.结束函数
    // 注意点: return后面不可以写任何语句, 因为执行不到
    return sum;
    printf("--------------\n");
    return m;
    return average;
     */
}

指针注意点

指针的指向可以修改

    int a = 10;
    int b = 5;
    
    int *p = &a;
    *p = 88;
    
    p = &b;
    
    *p = 44;
    
    printf("%i\n", a);
    printf("%i\n", b);

指针类型是什么类型, 就只能指向什么类型的数据

多级指针

指向指针地址的指针,保存的是指针的地址。

指针为什么分类型

因为当我们利用指针去取值的时候, 系统就会自动根据指针的类型来确定应该取对少个字节中的值

mac(64位)系统上,指针无论什么类型,都占8个字节,因为

64=8*8

/*
    char *cp;
    int *ip;
    double *dp;
    double **dpp;
    // mac系统中的指针无论是什么类型, 几级真正都占用8个字节
    // 由于Mac是64位了,  32  = 4 * 8;  64 = 8 * 8;
    printf("cp = %lu, ip = %lu, dp = %lu, dpp = %lu\n", sizeof(cp), sizeof(ip), sizeof(dp), sizeof(dpp));
     */
    // 指针为什么要分类型?
    // 因为当我们利用指针去取值的时候, 系统就会自动根据指针的类型来确定应该取对少个字节中的值

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值