8.2 指针变量

目录

第八章 善于利用指针

8.2 指针变量

8.2.1 使用指针变量的例子

8.2.2 怎样定义一个指针变量

8.2.3 怎样引用指针变量

8.2.4指针变量作为函数参数


第八章 善于利用指针

8.2 指针变量

8.2.1 使用指针变量的例子

上节内容我们可知 指针变量就是存放地址的变量。如果用指针指向一个对象(如变量,数组,函数等),该如何去定义和使用指针变量呢?

#include<stdio.h>
int main(){
    int a =100,b =10;              //定义整型变量a,b,同时初始化;
    int *pointer1,*pointer2;       //定义整型指针变量pointer1,pointer2;
    pointer1 = &a;                 //将变量a的地址赋给指针变量pointer1;
    pointer2 = &b;                 //将变量的地址赋给指针变量pointer2;
    printf("a=%d,b=%d\n",a,b);     //输出变量a,b的值;
    printf("*pointer1=%d,*pointer2=%d\n",*pointer1,*pointer2);
                                   //输出指针变量所指的对象,*是表示指针变量所指的对象;
    return 0;
}

运行结果:

程序分析:

1   int *pointer1,*pointer2;      、
2   pointer1 = &a;                 
3   pointer2 = &b;

第一行定义两个指针变量pointer1,pointer2。

第二行指针变量pointer1指向变量a的地址。

第三行指针变量pointer2指向变量b的地址。

 printf("*pointer1=%d,*pointer2=%d\n",*pointer1,*pointer2);

该代码中的*pointer1,*pointer2与上面定义中的含义不同,定义“*”表示该变量是一个指针变量。printf打印函数中的“*”则代表指针变量pointer1和pointer2所指向的变量a和b。

8.2.2 怎样定义一个指针变量

定义一个指针变量的一般形式为:

类型名 * 指针变量名;

 实例:int *pointer1,*pointer;

定义指针必须指定“基类型”,如上面的int。指针变量的基类型用来指定该指针变量可以指向的变量的类型。int的指针不能指向char 类型的变量。

(强调一下,类型决定了该数据存储所占用的字节长度,通过变量找到地址编号,根据类型的区分来获取字节大小的数据存取。)

*注意:

  1. 指针变量前面的“*”表示该变量为指针类型变量。指针变量名为pointer1和pointer2,而不是*pointer1和*pointer2。“*pointer1=&a和*pointer2=&b”这种写法是错误的。因为a的地址是赋给指针变量pointer1,而不是赋给*pointer1(也就是变量a)。
  2. 在定义指针变量时必须指定基类型,这是因为不同的数据在内存中所占的字节数和存放方式是不同的。一个变量的指针的含义包括两个方面,一是以存储单元编号表示的纯地址(如编号2000的字节),二是指针变量所指向的存储单元的数据的类型(如char,int,float等)。
  3. 如何表示指针类型。指向整型数据的指针类型表示“int *”,读作“指向int的指针”或简称“int 指针”。
  4. 指针变量只能存放地址,不能将一个整数赋给一个指针变量。int * a = 100;(x) a是指针变量,100是整数,不合法。

8.2.3 怎样引用指针变量

(1)给指针变量赋值。如:

int *p;     //定义一个int类型的指针变量p。基类型是int,指针变量名是p。p
p = &a;     //int类型的变量a所在的地址赋给p。记住&是取地址符。

(2)引用指针变量指向的变量。

printf("%d",*p);
//该作用是通过printf打印函数以整数形式输出指针变量p所指向变量a的值。
*p = 521;     //将整数521赋给指针变量p所指向的变量a,也就相当于将521赋给变量a。等同于a=521;

(3)引用指针变量的值。

printf("%o",p);   //该作用是通过print函数以八进制形式输出指针变量p的值。也就是&a,变量a的地址。

*注意

  1.  取地址运算符。&a是变量a的地址
  2. *  指针运算符(或称“间接访问运算符”),*p表示指针变量p所指的对象。

例题 输出a和b两个整数,按先后大小顺序输出a和b。

解题思路:用指针方法来处理这个问题,不交换整型变量的值,而是交换两个指针变量的值。

#include<stdio.h>
int main(){
    int a,b,*p1,*p2,*p;
    printf("请输入两个整数\n");
    scanf("%d %d",&a,&b);
    p1 = &a;
    p2 = &b;
    if(a<b){
        p = p1,p1=p2,p2=p;
        printf("max=%d,min=%d\n",*p1,*p2);
        printf("a=%d,b=%d\n",a,b);
        
    }else{
        printf("max=%d,min=%d\n",*p1,*p2);
        printf("a=%d,b=%d\n",a,b);
    }
    return 0;
}

运行结果如下:

程序分析:输入a=12,b=24,由于a<b,将p1和p2交换。由运行结果可知a和b的值并未发生改变,改变的是p1和p2的地址发生了互换。p1的值由&a——>&b,而p2的值由&b——>&a。这样输出*p1和*p2的值实际上输出的是变量b和变量a的值。

8.2.4指针变量作为函数参数

函数参数不仅可以是int,char ,float等数据,还可以是指针类型,它的作用是将一个变量的地址传送到另一函数中。

例题 输出a和b两个整数,按先后大小顺序输出a和b。现用函数处理,而且用指针类型的数据作为参数。

解题思路:定义一个函数swap,将指向两个整型的变量的指针变量(内放两个变量的地址)作为实参传递swap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。

#include<stdio.h>
int main(){
    void swap(int *p1,int *p2);
    int a,b,*pointer1,*pointer2;
    printf("请输入两个整数\n");
    scanf("%d %d",&a,&b);
    pointer1 = &a;
    pointer2 = &b;
    if(a<b){
        swap(pointer1,pointer2);
    }
    printf("max=%d min=%d\n",*pointer1,*pointer2);
    printf("a=%d b=%d\n",a,b);
    return 0;
}

void swap(int *p1,int *p2){
    int p ;
     p = *p1;
    *p1 = *p2;
    *p2 = p;
}

运行结果如下:

程序分析:swap是用户自己自定义的函数,函数作用是交换两个变量(a和b)的值。swap函数的形参是两个int类型的指针,函数体执行语句实现指针变量所指向的对象发生交换。也就是mian函数中a和

b的值发生互换。这就是为什么运行结果a=24,b=12的原因。记住“*p1,*p2是指针变量所指对象的值"。与上例不同(上例交换的指针变量的地址,而变量a,b的值未发变化)。

 

思考一个问题:实参的值传递给形参的值是单向传递,为什么指针变量作为形参,实参的值也发生了改变呢?

在函数执行过程中使指针变量所指向的变量值发生了改变,函数调用结束后,这些变量值的变化依然保存了下来。通过调用函数使变量的值发生了改变。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值