C/C++ 各形式指针和引用输出结果

本文详细介绍了C/C++中的指针概念,包括普通指针、数组指针和多级指针的使用,以及引用的特性。通过实例展示了指针变量的值、地址以及解引用操作。同时,对比了函数参数传递时指针和引用的区别,强调了引用必须在创建时初始化且不能改变引用目标的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针是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);
这句话是为了输出结果对齐
对齐的语句只适用于下一行,有点麻烦,网上对此介绍不多,也就没时间自己琢磨了。
对于指针和引用的研究比较浅显,以后有时间在补补

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值