前言:
通过学习我们认识了什么是指针,就让我们一起来分析一个例子。
#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元钱的支持了,这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。