重温C语言三之----指针的认识

指针类型

指针入门

介绍:

对于指针的介绍,我想用生活中最显而易见的例子去描述。我们在生活中肯定有接收过快递吧,一个快递和除了有别人寄给你的东西外,外面还贴了一张订单,里面有你买的东西别名和寄到你家的收货地址当然还有一个你看不懂的快递条形码(这个条形码记录了这个快递最详细的地址而且还是独一无二的。)。如果说把快递盒和物品比作一个变量。快递盒里面的物品就是这个变量所赋的值,而快递单上的地址可以看作是变量名,然后那串你看不懂的条形码就可以看作是变量的地址了。对于指针变量我们可以这样想象,在快递盒子里面装的不再是物品了而是另一个快递的条形码。因此打开这个快递盒我们并不能得到我们想要的物品但是可以知道装有那个物品所在的快递盒的位置,是不是有种寻宝的味道,下面就让我结合实际例子来深入的告诉你吧!

#include <stdio.h>
//讲解指针入门(最核心的内容)
void mainn() {
    int num=1;
    //定义一个指针变量
    /*
     * 说明:1.int *表示指针类型;
     * 2.名称 ptr
     * 3.ptr指向int类型的变量地址
     */
    int *ptr=&num;
​
​
    //num的地址是多少
    //说明1:如果要输出一个变量的地址,使用格式是%p
    //说明2:&num表示取出num这个变量
    printf("num  is=%d num address is=%p\n",num,&num);
    结果是:num  is=1 num address is=000000000061FE1C即num的值为1,而num的地址值是000000000061FE1C
​
    //1.指针变量也有地址&ptr(%p)
    //2.指针变量,存放的地址值为ptr(%p);
    //3.获取指针指向的值*ptr
    printf("ptr  is=%p ptr address is=%p ptr point value is=%d\n",ptr,&ptr,*ptr);
    结果是:
ptr  is=000000000061FE1C ptr address is=000000000061FE10 ptr point value is=1即指针变量的所存的值与num的地址值是相同的。但是后面的是该指针类型的地址值。
​
}
​
​

对于这个指针,我以前一直搞不懂有什么用,直到我看到了这个案例:

#include<stdio.h>
void main(){
  //写一个程序。获取一个int变量num的地址,并显示到终端
  //将num的地址赋给指针ptr,并通过ptr去修改num的值;
​
  int num=88;
  int *ptr =&num;
  //先输出num没有修改的情况
    printf("num 的地址值是=%p num 所存的值是 =%d\n",&num,num);
  //通过指针修改num的值,num变量的值也会被修改。
  *ptr =100;
  printf("num 的地址值是=%p num 所存的值是 =%d\n",&num,num);
  printf("ptr 所存的地址值是 =%p ptr 所指向的变量值为 =%d",ptr,*ptr);
}
//以下是运行结果
D:\CProjects\untitled2\cmake-build-debug\untitled2.exe
num 的地址值是=000000000061FE14 num 所存的值是 =88
num 的地址值是=000000000061FE14 num 所存的值是 =100
ptr 所存的地址值是 =000000000061FE14 ptr 所指向的变量值为 =100
Process finished with exit code 62

从这个案例我们可以发现通过对指针所指向的值进行改变可以直接对变量的直接进行改变。看完之后我不由地说一句:“好一招釜底抽薪啊”!只要一个指针盒地址,改值顷刻之间!! !

再来一个改值操作吧

#include<stdio.h>
void mainn3(){
    //定义一个int变量
    int num=100;
  //  定义一个int*型指针变量,并将num的地址值值赋予指针变量p
    int * p=&num;
    //在定义一个p2指针变量,并将p赋予p2也意味着p2存的是num的地址值
    int *p2=p;
    //通过改变指针变量p2所指向的值
    *p2=55;
    //printf("%d",num);//输出55
    //以下三个都是55
    printf("num=%d *p=%d *p2=%d",num,*p,*p2);
结果三个都是55,这可能就是二重指针了吧!
}
​

指针细节说明

1)基本类型,都有对应的指针类型,形式为数据类型 *,比如int的对应的指针就是int *,float对应的指针类型就是 float *,依次类推;

2)此外还有指向数组的指针,指向结构体的指针,指向共用体的指针。

值传递和地址传递

C语言传递参数(或者赋值)可以是值传递(pass by value),也可以是传递指针(a pointer passed by value),传递指针也叫地址传递。

【1】默认传递值的类型:基本数据类型(整数类型、小数类型、字符类型)结构体。共用体

【2】默认传递地址的类似:指针、数组

值传递和地址传递的使用特点

1)值传递:将变量指向存储内容,在传递/赋值时。拷贝一份给接收变量

2)地址传递:也叫做指针传递:如果是指针,就将指针变量存储的地址。传递给接收变量,如果是数组,就将数组的首地址传递给接收变量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值