指针是C/C++的重难点,难在于它的灵活,重要也在于它的灵活,可以实现许多功能。
这里只给出结果供分析,不给出结论。
普通指针
int a = 10;
int* pointer = &a;
// a : 10
// &a : 0x7ffc0c1e35fc
// pointer : 0x7ffc0c1e35fc
// *pointer : 10
// &pointer : 0x7ffc0c1e3600
数组指针
int b[3] = {11,22,33};
int* pb = b;
// b : 0x7ffdffeb696c
// *b : 11
// &b : 0x7ffdffeb696c
// b[0] : 11
// b[1] : 22
// *b+1 : 12
// *(b+1) : 22
// b+1 : 0x7ffdffeb6970
// pb : 0x7ffdffeb696c
// *pb : 11
// &pb : 0x7ffdffeb6960
// pb+1 : 0x7ffdffeb6970
// *pb+1 : 12
// &pb+1 : 0x7ffdffeb6968
多级指针
int i = 123;
int* pointer1 = &i;
int** pointer2 = &pointer1;
int*** pointer3 = &pointer2;
// i : 123
// &i : 0x7fff0d6b13bc
// pointer1 : 0x7fff0d6b13bc
// *pointer1 : 123
// &pointer1 : 0x7fff0d6b13c0
// pointer2 : 0x7fff0d6b13c0
// *pointer2 : 0x7fff0d6b13bc
// &pointer2 : 0x7fff0d6b13c8
// pointer3 : 0x7fff0d6b13c8
// *pointer3 : 0x7fff0d6b13c0
// &pointer3 : 0x7fff0d6b13d0
引用
int a = 22;
int& pointer = a;
// a : 22
// &a : 0x7ffef4f9080c
// pointer : 22
// &pointer : 0x7ffef4f9080c
#include <iostream>
#include <iomanip>
using namespace std;
/*
"*" 的几个含义 int* pointer; 声明一个int类型的指针变量
x * y 乘法运算
*pointer; 取出指针变量pointer 中保存的内存地址对应的内存中的值
*/
void testOne(){
int a = 10;
int* pointer = &a;
// cout.setf(ios::left); //设置对齐方式为left
// cout.width(15); //设置宽度为7,不足用空格填充
cout << setiosflags(ios::left) << setw(15);
cout << " a :" << a << endl;
cout << setiosflags(ios::left) << setw(15);
cout << " &a :" << &a << endl;
cout << setiosflags(ios::left) << setw(15); //设置宽度为7,left对齐方式
cout << " pointer :" << pointer << endl;
cout << setiosflags(ios::left) << setw(15);
cout << " *pointer :" << *pointer << endl;
cout << setiosflags(ios::left) << setw(15);
cout << " &pointer :" << &pointer << endl;
// 结果
// a : 10
// &a : 0x7ffc0c1e35fc
// pointer : 0x7ffc0c1e35fc
// *pointer : 10
// &pointer : 0x7ffc0c1e3600
}
void testTwo(){
int b[3] = {11,22,33};
int* pb = b;
cout << setiosflags(ios::left) << setw(15);
cout << "b :" << b << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "*b :" << *b << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "&b :" << &b << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "b[0] :" << b[0] << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "b[1] :" << b[1] << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "*b+1 :" << *b+1 << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "*(b+1) :" << *(b+1) << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "b+1 :" << b+1 << endl;
//------------------------------------
cout << setiosflags(ios::left) << setw(15);
cout << "pb :" << pb << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "*pb :" << *pb << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "&pb :" << &pb << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "pb+1 :" << pb+1 << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "*pb+1 :" << *pb+1 << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "&pb+1 :" << &pb+1 << endl;
// 无效
// cout << b[] << endl;
// cout << *b[] << endl;
// cout << &b[] << endl;
// 结果
// b : 0x7ffdffeb696c
// *b : 11
// &b : 0x7ffdffeb696c
// b[0] : 11
// b[1] : 22
// *b+1 : 12
// *(b+1) : 22
// b+1 : 0x7ffdffeb6970
// pb : 0x7ffdffeb696c
// *pb : 11
// &pb : 0x7ffdffeb6960
// pb+1 : 0x7ffdffeb6970
// *pb+1 : 12
// &pb+1 : 0x7ffdffeb6968
}
void testThree(){
int i = 123;
//int类型的一级指针
int* pointer1 = &i;
//int类型的二级指针 二级指针只能保存一级指针的地址
int** pointer2 = &pointer1;
//int类型的三级指针 三级指针只能存二级指针
int*** pointer3 = &pointer2;
cout << setiosflags(ios::left) << setw(15);
cout << "i :" << i << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "&i :" << &i << endl;
//------------------------------------
cout << setiosflags(ios::left) << setw(15);
cout << "pointer1 :" << pointer1 << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "*pointer1 :" << *pointer1 << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "&pointer1 :" << &pointer1 << endl;
//------------------------------------
cout << setiosflags(ios::left) << setw(15);
cout << "pointer2 :" << pointer2 << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "*pointer2 :" << *pointer2 << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "&pointer2 :" << &pointer2 << endl;
//------------------------------------
cout << setiosflags(ios::left) << setw(15);
cout << "pointer3 :" << pointer3 << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "*pointer3 :" << *pointer3 << endl;
cout << setiosflags(ios::left) << setw(15);
cout << "&pointer3 :" << &pointer3 << endl;
// 结果
// i : 123
// &i : 0x7fff0d6b13bc
// pointer1 : 0x7fff0d6b13bc
// *pointer1 : 123
// &pointer1 : 0x7fff0d6b13c0
// pointer2 : 0x7fff0d6b13c0
// *pointer2 : 0x7fff0d6b13bc
// &pointer2 : 0x7fff0d6b13c8
// pointer3 : 0x7fff0d6b13c8
// *pointer3 : 0x7fff0d6b13c0
// &pointer3 : 0x7fff0d6b13d0
}
// 不存在空引用
// 一旦引用被初始化为一个对象,就不能被指向到另一个对象
// 引用必须在创建时被初始化
void testFour(){
int a = 22;
int& pointer = a;
cout << setiosflags(ios::left) << setw(15);
cout << " a :" << a << endl;
cout << setiosflags(ios::left) << setw(15);
cout << " &a :" << &a << endl;
cout << setiosflags(ios::left) << setw(15);
cout << " pointer :" << pointer << endl;
cout << setiosflags(ios::left) << setw(15);
cout << " &pointer :" << &pointer << endl;
// 结果
// a : 22
// &a : 0x7ffef4f9080c
// pointer : 22
// &pointer : 0x7ffef4f9080c
}
//函数传入指针作为参数
void testFive(int a)
{
a = 6;
return;
}
//函数传入指针作为参数
void testSix(int *a)
{
*a = 6;
return;
}
//函数传入引用作为参数
void testSiven(int& a)
{
a = 66;
return;
}
void testFourSixSiven(){
int x = 10;
int* a = &x;
int& b = x;
testFive(x);
cout << "普通函数:" << x << endl;
testSix(a);
cout << "函数传入指针作为参数:" << x << endl;
testSiven(b);
cout << "函数传入引用作为参数:" << x << endl;
// 结果
// 普通函数:10
// 函数传入指针作为参数:6
// 函数传入引用作为参数:66
}
//函数返回指针
// int * myFunction()
// {
// .
// .
// }
//函数返回引用
// int& myFunction() {
// .
// .
// .
// }
int main()
{
testOne();
testTwo();
testThree();
testFour();
testFourSixSiven();
return 0;
}
cout << setiosflags(ios::left) << setw(15);
这句话是为了输出结果对齐
对齐的语句只适用于下一行,有点麻烦,网上对此介绍不多,也就没时间自己琢磨了。
对于指针和引用的研究比较浅显,以后有时间在补补