C语言指针学习 之 指针变量

前言:

        通过学习我们认识了什么是指针,就让我们一起来分析一个例子。

#include<stdio.h>
int main()
{
    int a=100;
    int * hz;  
    hz =&a;
    printf("a=%d \n",a);
    printf("*hz=%d \n",*hz);
  return 0;
}


a=100 
*hz=100 
PS C:\csay\cyuyan> 

        (1)在开头处定义了一个指针变量hz,此时并没有指向任何一个变量,只是提供一个指针变量,规定它可以指向整型变量,hz =&a就是使hz指向a,此时hz的值为a的地址。

        (2) printf("*hz=%d \n",*hz)输出*hz的值,其中的*表示指向,*hz表示指针变量hz指向的变量,也就是变量a。

        (2)程序中出现了两处*hz,它们的含义不同,第一个*hz表示定义了一个指针变量hz,前面的*表示该变量是指针变量,第二个*hz代表指针变量hz所指向的变量。

指针变量的定义:

        C 语言规定所有变量在使用前必须先定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是专门用来存放地址的,所以必须将它定义为“指针类型”。

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

        基类型 *指针变量名;

        比如:

        int*i;    float*j;

        “*” 表示该变量的类型为指针类型。指针变量名为 i 和 j,而不是 *i 和 *j。

        在定义指针变量时必须指定其“基类型”。指针变量的“基类型”用来指定该指针变量可以指向的变量的类型。比如“int*i;”表示 i 只可以指向 int 型变量;又比如“float*j;”表示 j 只可以指向 float 型变量。

        “基类型”就表示指针变量里面所存放的“变量的地址”所指向的变量可以是什么类型的。说得简单点就是:以“int*i;”为例,“*”表示这个变量是一个指针变量,而“int”表示这个变量只能存放 int 型变量的地址。

        为什么叫“基类型”,而不直接叫类型?因为比如“int*i;”,其中 i 是变量名,i 变量的数据类型是“int*”型,即存放 int 变量地址的类型。“int”和“*”加起来才是变量i的类型,所以 int 称为基类型。

        “int*i;”表示定义了一个指针变量 i,它可以指向 int 型变量的地址。但此时并没有给它初始化,即此时这个指针变量并未指向任何一个变量。此时的“*”只表示该变量是一个指针变量,至于具体指向哪一个变量要在程序中指定。这个就跟定义了“int   j;”但并未给它赋初值一样。

        指针变量也是变量,是变量就有地址,所以指针变量本身也是有地址的。只要定义了一个变量,程序在运行时系统就会为它分配内存空间。但指针变量又是存放地址的变量,所以这里有两个地址大家一定要弄清楚:一个是系统为指针变量分配的地址,即指针变量本身的地址;另一个是指针变量里面存放的另一个变量的地址。这两个地址一个是“指针变量的地址”,另一个是“指针变量的内容”。

        地址也是可以进行运算的,我们后面会学到指针的运算和移动。比如“使指针向后移 1 个位置”或“使指针加 1”,这个 1 与指针变量的基类型是直接相关的。指针变量的基类型占几字节,这个 1 代表的就是几。比如指针变量指向一个 int 型变量,那么“使指针移动 1 个位置”就意味着移动 4 字节,“使指针加 1”就意味着使地址加 4。所以必须指定指针变量所指向的变量的类型,即指针变量的基类型。

        下面给大家举一个例子并分析。

# include <stdio.h>
int main (void)
{
    int * p , * q;
    int k; 
    int i = 3, j = 4;
    p = &i;
    q = &j;
    k = p-q;
    printf(" p = %d\n q = %d\n k = %d\n", p, q, k);
    return 0;
}


 p = 6422024
 q = 6422020
 k = 1
PS C:\csay\cyuyan> 

        两个“int*”型的指针变量相减,第一个指针变量里面存放的地址是6422024,第二个指针变量里面存放的地址是6422020,那么这两个地址相减的结果是是 1,而不是 4。因为 int 型变量占 4 字节,所以一个 int 元素就占 4 字节,两个地址之间相差 4 个地址,正好是一个 int 元素,所以结果就是 1 。

指针变量的引用:  

        引用指针变量时有以下三种情况:

        ① 给指针变量赋值。 ② 引用指针变量指向的变量。 ③引用指针变量的值。

int a, *p;
p=&a;                  //把a的地址赋给指针变量p
printf("%d",*p);    //以整数形式输出指针变量p所指向的变量的值,即a的值
*p=1;                   //将整数1赋给p当前所指向的变量,由于p指向变量a,相当于把1赋给a,即a=1
printf("%o",p);      //以八进制形式输出指针变量p的值,由于p指向a,相当于输出a的地址,即&a

注意:

要熟练掌握两个有关的运算符:

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

        下面给大家举一个例子并分析。

#include <stdio.h>
int main()
{	
  int *p1,*p2;	
  int a,b;

	printf("请输入2个数字:");
	scanf("%d %d",&a,&b);

	     p1=&a;							
	     p2=&b;	

	if(a<b)						
	{	
     p1=&b;
     p2=&a;
    }
  else
  {
    p1=&a;							
	  p2=&b;
  }		
	printf("a=%d,b=%d\n",a,b);			

	printf("max=%d,min=%d\n",*p1,*p2);	
	return 0;
}


请输入2个数字:7 8
a=7,b=8
max=8,min=7
PS C:\csay\cyuyan> 
请输入2个数字:3 2
a=3,b=2
max=3,min=2
PS C:\csay\cyuyan> 

        开头处定义了2个指针变量p1和p2,此时并没有指向任何一个变量,只是提供一个指针变量,规定它可以指向整型变量,其次从键盘输入2个整型数据,判断a和b的大小,如果a<b,则将p1和p2交换否则不交换,最后输出p1和p2所指向变量的值。、

🚀感谢:给读者的一封信


亲爱的读者:

       这篇文章中我投入了大量的心血和时间,希望为大家提供有价值的内容。

        如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持了,这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响,也鼓励我花更多的时间和精力创作更多有价值的内容。

        如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

                    

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值