指针是C语言的重要角色,合理的使用指针可以使C语言编写的程序更加简洁高效,本期博客主要介绍指针的基本概念,指针变量的定义与使用。后续将持续更新指针相关内容。
目录
一、概念
简单来说,指针就是地址,通过地址能找到所需变量单元。
如下图:P是指向变量ch的指针变量。
计算机内存是以字节为单位的连续存储空间,每个字节的存储单元都有唯一的编号这个编号称为内存地址(地址)。
二、指针变量的定义
一般格式如下:类型说明符 *指针变量名
int *p;//定义1个指向int型变量的指针变量P
char *pc,c;//定义1个指向char型变量的指针变量 pc和一个char型变量c
double *q,*r;//定义2个指向double型变量的指针变量 q 和r
说明:定义指针变量后系统会自动为该指针变量分配存储空间。指针变量所占的存储空间是相同的,和 所指向的数据类型无关,与操作系统和编译器有关。
32位操作系统——四个字节
64位操作系统——八个字节
三、指针变量的初始化
野指针:未初始化时,指针变量并没有存放其所指向变量的地址,这是指针变量的值是随机的,可指向内存中的任何位置,称为野指针。使用野指针相当危险,会引起系统崩溃。
指针变量初始化一般格式:类型说明符 *指针变量名=初始地址值;
int x=100;
int *p=&x;//&x为int型变量x在内存中的起始地址
int *q=p;//p为指向int 型变量x的指针
注意:1.把一个变量的地址作为初始地址值时,这个变量必须先定义,并且这个变量的数据类型与指针变量所指向的类型相同。
2.如果一开始指针变量无法与某个具体初始地址值关联可以把它初始化为NULL。
int *pi=NULL;//这个指针不指向任何内存,NULL是头文件定义的符号常量,其值与整数0对应。
四、指针变量的赋值
(1)把某个变量的地址赋给指针变量:指针变量=变量地址;
(2)把一个指针变量的值赋给另一个指针变量:指针变量1=指针变量2;
注意:(2)中指针变量1 和指针变量2 所指向的数据类型必须相同,而且指针变量2需要已经指向某个内存单元。
五、指针变量的引用
通过间接引用运算符 * 可对指针变量所指向的变量进行间接访问。
格式: * 指针变量
int a=10,*p;//*为指针定义符
p=&a;//指针变量p指向变量 a
*p=20;//*为间接引用符,相当于a=20
(*p)++;//*为间接引用符,相当于a++
注意:1.定义中的 * 为指针定义符表示它后面是指针变量;执行语句中的 * 为间接引用运算符。
2.“*p++"(++作用于P)不等于(*P)++(++作用于*P)。
六、指针变量作为函数参数
例如swap函数用于交换两个整数,编写程序输入两个整数x,y调用函数swap将其按从小到大顺序输出。
错误代码:
#include <stdio.h>
void swap(int a,int b)//此时a=x,b=y
{
int tmp;
temp=a;
a=b;
b=tmp;
}//结束后a,b的值交换了但是x,y 的值没有交换
int main()
{
int x,y;
printf("please input x and y");
scanf("%d%d",&x,&y);
if(x>y)swap(x,y);//按传值方式传参
printf("%d%d",x,y);//输出发现并没有达到效果
return 0;
}
正确代码
#include <stdio.h>
void swap(int *px,int *py)
{
int tmp;
temp=*px;
*px=*py;
*py=tmp;
}
int main()
{
int x,y;
printf("please input x and y");
scanf("%d%d",&x,&y);
if(x>y)swap(&x,&y);//按传地址方式传参
printf("%d%d",x,y);
return 0;
}
这个例子就是把指针变量作为函数参数。
本期博客到这里就结束了~指针章节内容繁多后续将持续更新,如果对你有帮助的话点赞收藏,期待后面更新吧~~