指针变量

指针变量(地址变量)是指专门用于存放变量的地址(即指针)的变量,其值是地址。

指针变量的定义:
类型名 *指针变量名;

//pointer_1,pointer_2指向int整型变量的指针变量,简称int指针
//左端的int是在定义指针变量时必须指定的“基类型”,基类型是用来指定此指针变量可以指向这些类型变量的指针
int *pointer_1,*pointer_2;

//可以在定义指针变量的时,对它进行初始化
//定义指针变量pointer_1.pointer_2,并分别指向a,b
int *pointer_1 = &a,*pointer_2 = &b;

在定义指针变量时的几点注意事项;
1.在定义指针变量时,指针变量前“”表示该变量的类型为指针型变量,指针变量的名为pointer_1,pointer_2,而不是pointer_1,*pointer_2;
2.在定义指针变量时必须指定基类型
有的人可能会认为既然指针变量是存放地址的,那么只需要指定它为“指针型变量”就可以了,为什么还要指定其基类型呢?
众所周知,不同类型的数据在内存中所占的字节数和存放方式是不同的,如果想通过指针引用一个变量,只知道地址(如2009)是远远不够的,因为无法判定是从地址为2000的一个字节中取出一个字符数据,还是熊2000和2001两个字节中取出short型数据,还是从2000到2003四个字节中取出1个int或者float型数据。因此,必须知道该数据的类型,才能按存储单元的长度以及数据的存储形式正确地取出数据。
3.指针变量中只能存放地址(指针),不要将一个整数赋给指针变量;

pointer = 100;    //此语句不合法

//代码愿意是想将地址100赋给指针变量pointer,但是系统无法判别他是地址,从形式上看100是整常数,而整常数只能赋给整型变量int,不能赋给指针变量。

怎样引用指针变量:
在引用指针变量时,主要有有3种情况,
(1)给指针变量赋值

pointer = &a;//把a的地址赋给指针变量pointer,指针变量pointer的值时变量a的地址,pointer指向a
(2)引用指针变量指向的变量

pointer = &a;                //指针变量pointer指向了整型变量a
printf("%d",*pointer);    //输出指针变量pointer所指向变量的值,即变量a的值(*pointer等价于a)
*pointer = 1;                 //将整数1赋值给指针变量pointer所指向的变量的值,即相当于把1赋值给a,等价于“a  = 1”

(3)引用指针变量的值

printf("%o",pointer);//以八进制数形式输出指针变量pointer的值,即a的地址(&a)

总而言之,两个有关的运算符:
(1)&:取地址运算符,&a是变量a的地址;
(2)*:指针运算符(或“间接访问”运算符),*pointer是指针pointer指向的变量
代码示例:

   //要求:输入a.b两个整数,按先后大小顺序输出
   int *pointer1, *pointer2, a, b;
   printf("please enter two integer number:\n");
   scanf_s("%d%d",&a,&b);
   pointer1 = &a;
   pointer2 = &b;
   if (a<b)
   {
          int *pointer;
          pointer = pointer1;
          pointer1 = pointer2;
          pointer2 = pointer;
   }
   printf("max = %d,min = %d",*pointer1,*pointer2);
   system("pause");
   return 0;

指针变量做函数参数
函数的参数可以是指针类型,他的作用是将一个变量的地址传递到另一个函数中。
在C语言中实参变量与形参变量之的数据传递是单向的“值传递”方式,用指针变量做函数参数时同样要遵循这一原则,不可能通过调用函数来改变实参指针变量的值(就是说不能改变实参的地址),但可以实参指针变量所指变量的值(可以改变内存单元的内容)。

//不能通过调用函数来改变实参指针变量的值(不能通过形参地址的改变来是实现实参地址的改变)       
    
        int main(void)
    {
           void swap2(int *pointer_1, int *pointer_2);
           int a, b, *pointer1, *pointer2;
           printf("enter a and b:\n");
           scanf_s("%d%d", &a, &b);
           pointer1 = &a;
           pointer2 = &b;
           if (a < b)
                  swap2(pointer1,pointer2);
           printf("Mmax = %d,Mmin = %d\n", a, b);
           system("pause");
           return 0;
    }
    void swap2(int *pointer_1, int *pointer_2)
    {
           int *temp;
           temp = pointer_1;
           pointer_1 = pointer_2;
           pointer_2 = temp;        //形参指针变量pointer_1、pointer_2的值(即地址)对调
           printf("Smax = %d,Smin = %d\n", *pointer_1, *pointer_2);
    }

    //但是形参指针变量所指变量的值发生了改变,那么在主调函数中可以使用这些改变了的值
    int main(void)
    {
            void swap(int *pointer_1,int  *pointer_2);
           int a, b, *pointer1, *pointer2;
           printf("please enter two integer numbers:\n");
           scanf_s("%d,%d", &a, &b);
           pointer1 = &a;
           pointer2 = &b;
           if (a < b)
                  swap1(pointer1,pointer2);
           printf("max = %d,min = %d\n",a,b);
    }    
    void swap1(int *pointer_1, int *pointer_2)
    {
         int temp;
         temp = *pointer_1;
         *pointer_1 = *pointer_2;
         *pointer_2 = temp;            
         //形参指针变量pointer_1\pointer_2的值(即地址)没有发生改变,但是他们指向地址中内容发生了改变(实参指针变量也
         //指向这些地址)
    }


//特殊情形:
void swap1(int *pointer_1, int *pointer_2)
{
     int *temp;
     *temp = *pointer_1;            //此语句有问题
     *pointer_1 = *pointer_2;
     *pointer_2 = temp;            //形参指针变量pointer_1\pointer_2的值(即地址)没有发生改变,但是他们指向地址中内容发生了
                                              //改变(实参指针变量也指向这些地址)
}
//在上面这段代码中,*temp是指针变量temp所指向的变量,但是由于未给temp赋值,因此temp并没有确定的值(它的值是不可
//预见的),所以temp所指向的单元也是不可预见的。所以,对*temp赋值就是向一个未知的存储单元赋值,而一个未知的存储
//单元中可能存储着一个有用的数据,就有可能破坏系统的正常工作状况。

代码示例:

//输入三个整数,要求按由大到小的顺序将他们输出,用函数实现。
int main(void)
{
       void exchange(int *pointer1, int *pointer2, int *pointer3);
       int a, b, c, *pointer_1, *pointer_2, *pointer_3;
       printf("please enter three numbers:\n");
       scanf_s("%d,%d,%d",&a,&b,&c);
       pointer_1 = &a;
       pointer_2 = &b;
       pointer_3 = &c;
       exchange(pointer_1, pointer_2, pointer_3);
       printf("the order is %d, %d, %d\n", a, b, c);
       system("pause");
       return 0;
}
void exchange(int *pointer1, int *pointer2, int *pointer3)
{
       void swap(int *pt1,int *pt2);
       if (*pointer1 < *pointer2)
              swap(pointer1, pointer2);
       if (*pointer1 < *pointer3)
              swap(pointer1, pointer3);
       if (*pointer2 < *pointer3)
              swap(pointer2, pointer3);
}
void swap(int *pt1,int *pt2)
{
       int temp;
       temp = *pt1;
       *pt1 = *pt2;
       *pt2 = temp;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值