指针的使用(常量指针、指针常量、空指针、野指针)

指针的基本概念

指针的作用:可以通过指针间接访问内存

  • 内存编号是从0开始记录的,一般用十六进制数字表示
  • 可以利用指针变量保存地址

指针变量的定义和使用

指针变量定义语法:数据类型 * 变量名;
(指针就是一个地址)

int a=10;
int *p;
p=&a;

等价于

int a=10;
int *p=&a;

运行结果:

int a=10;
int *p=&a;
*p=1000;

cout<<"p="<<p<<endl;
cout<<"a="<<a<<endl;
cout<<"*p="<<*p<<endl;
//p=0x6ffe04 a=1000 *p=1000

指针p中存放的就是变量a的地址,*p表示指向(地址对应)的内存中的数据

指针所占内存空间

在32位操作系统下,指针占4个字节空间大小,不管是什么数据类型(int *、float *、double *、char *)
在64位操作系统下,指针占8个字节空间大小
(可以通过sizeof(int *)来求所占空间大小)

空指针和野指针

空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的

int *p=NULL;
//0~255之间的内存为系统占用内存,不允许访问
//cout<<*p<<endl;//非法访问

野指针:指针变量指向非法内存空间

int *p=(int *)0x1100;
cout<<*p<<endl;

const修饰指针

const修饰指针有三种情况:
1.const修饰指针(常量指针----const int * p)
2.const修饰常量(指针常量----int * const p)
3.const即修饰指针又修饰常量(const int * const p)

int a=10;
int b=20;

//常量指针 指针的方向可以更改,指针指向的值不可更改
const int * p=&a;
p=&b;
// *p=20;//错误,表示对指向内存中的值进行更改
cout<<*p<<endl;

//指针常量 指针的方向不可以更改,指针指向的值可以更改
int * const p1=&a;
// p1=&b;//错误,改变指向
*p1=30;
cout<<*p1<<endl;
cout<<"a="<<a<<endl;
//30 a=30

//const既修饰指针又修饰常量 指针指向和指针指向的值均不可以更改
const int * const p2=&a;
// *p2=20;
// p2=&b;
// cout<<*p2<<end;

指针和数组

作用:利用指针访问数组中元素

int arr[5]={1,2,3,4,5};//数组名就是数组的首地址
int * p3=arr;
int x=sizeof(arr)/sizeof(arr[0]);
for(int i=0;i<x;i++)
{
	cout<<*p3<<endl;
	p3++;
}

指针和函数

作用:利用指针作函数参数,可以修改实参的值

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

int main()
{
	int a=10;
	int b=20;
	swap(&a,&b);
	cout<<"a="<<a<<" b="<<b<<endl;
}
void bubbleSort(int *arr,int len)//int *arr等价于int arr[]
{
......
}

指针和字符串

char *p="I love China!";
printf("%s\n",p);
//等价于
//char *p;
//p="I love China!";

结构体指针

作用:通过指针访问结构体中的成员
利用操作符 -> 可以通过结构体指针访问结构体属性(结构体变量只能通过 . 来访问结构体属性 )

struct student
{
	string name;
	int age;
	int score;
};
int main()
{
	//创建学生的结构体变量
	student s={"ZhangSan",18,100};
	//通过指针指向结构体变量
	student *p=&s;
	//通过指针访问结构体变量中的数据 指针+"->"等价于 s+"."
	cout<<"name:"<<p->name<<" age:"<<p->age<<" score:"<<p->score<<endl;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值