C++指针(一): 指针初探,一级指针与二级指针

C++指针(一): 指针初探,一级指针与二级指针

一级指针

指针的定义和简单使用
首先要注意的是,定义时 * 号的作用和使用时 * 号的作用是不一样的:

#include<iostream>
int b = 0;
int *a = &b;
std::cout<<a<<endl;
std::cout<<*a<<endl;

定义指针变量时,*号的含义是指针说明符,本身并不是变量的一部分;上述定义语句中,说明变量a是指向整型数据的指针;
而在输出语句中,*的含义是解引用符/"指向"运算符,即取a指针指向地址(即b的地址)的变量(b)的值;

需要注意的是,在定义指针变量时要进行初始化,若没有初始化指针的值,那么其值是随机的,可能会造成错误;

指向结构体便量的指针

struct student
{
	int num;
	char name[20];
}stu1,stu2, *st1=&stu1, *st2=&stu2;

指向结构体的指针变量指向的是结构体变量的首地址,而不是某成员的地址;
访问结构体的成员->

int main()
{
	std::cout << st1->name << std::endl;
	return 0;
}

多级指针
由于指针型变量的类型是指针型,存放其地址的变量不能是普通的指针变量,这种“指针的指针”,即指向指针变量指针变量,叫做多级指针。通常使用比较多的是二级指针。

注意:二级指针的初始值必须是一级指针变量的地址,且一二级的指针类型要相同

#include <iostream>

int main() 
{
	int b = 0;
	int* a = &b; // a: primary pointer
	int** c = &a; // c: second rank pointer, store the address of pointer a

	std::cout <<"addres of b: "<< &b << std::endl; // address of b
	std::cout << "a: "<< a << std::endl; // a = &b, a = address of b
	std::cout << "address of a: "<< &a << std::endl; // address of pointer a
	std::cout << "c: "<< c << std::endl; // address of pointer a
	std::cout << "*c: "<< *c << std::endl; // &b
	std::cout << "**c: " << **c << std::endl; // b

	return 0;
}

需要注意的是,在定义语句中:

int b = 0;
int* a = &b; // a: primary pointer
int** c = &a; // c: second rank pointer, store the address of pointer a

*: 一级指针的说明符,说明a是int类型的指针变量; (一级指针)
**: 二级指针的说明符,说明c是int类型的指针变量; (二级指针)

在调用语句中:

&b // 表示int型变量b的地址
a // a的值是int型变量b的地址
*a 
// 这里的"*"是指向型运算符,不是定义中的说明符,这里表示的是
// int类型的指针变量a指向的变量(也就是变量b)
c // c的值是int型指针变量a的地址
*c 
// "*"为指向型运算符,*c表示int型二级指针变量c的指向(也就是a的值)
// 而a的值为变量b的地址,所以*c = a = &b
**c
// **c可以理解为:对*c再取指向,即对&b(b的地址)取它的指向,即int型变量b
// 即**c = *a = *(&b) = b
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值