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