ROS基础知识学习笔记(2)—C++指针

(一)指针

#include <iostream>

using namespace std;

int main()
{
    int a=10;
    int* p;
    p=&a;

    cout<<"变量a的值\t"<<a<<endl;
    cout<<"变量a的地址\t"<<&a<<endl;
    cout<<"指针p的值\t"<<p<<endl;
    cout<<"指针p的地址\t"<<&p<<endl;
    cout<<"变量a的值\t"<<*p<<endl;

    cout<<"int指针大小\t"<<sizeof(int*)<<endl;
    cout<<"double指针大小\t"<<sizeof(double*)<<endl;
    cout<<"string指针大小\t"<<sizeof(string*)<<endl;
    return 0;
}

输出(本人电脑Ubuntu16.04是64位的)

变量a的值       10
变量a的地址     0x7ffdb9b4f24c
指针p的值       0x7ffdb9b4f24c
指针p的地址     0x7ffdb9b4f250
变量a的值       10
int指针大小     8
double指针大小  8
string指针大小  8

(二)空指针和野指针

  1. 空指针:指针变量指向内存编号为0的空间
    用途:初始化指针变量
    注意:空指针指向内存不可以访问
  2. 野指针:指针变量指向非法的内存空间

(三)const修饰指针

1.const修饰指针——常量指针

#include <iostream>

using namespace std;

int main()
{
    int a=10;
    int b=20;

    const int* p=&a;
    cout<<p<<endl;
    
    p=&b;
    cout<<p<<endl;

    cout<<*p<<endl;
    return 0;
}

输出

0x7ffc91723f28
0x7ffc91723f2c
20

特点:常量指针指向可以修改,但指向的值不可以修改

*p=30;   	//会提示错误

2.const修饰常量——指针常量

#include <iostream>

using namespace std;

int main()
{
    int a=10;
    int b=20;

    int* const p=&a;
    cout<<p<<endl;
    cout<<*p<<endl;

    *p=50;
    cout<<*p<<endl;
    return 0;
}

输出

0x7fff704eba98
10
50

特点:指针常量指向不可以修改,但指向的值可以修改

3.死指针

#include <iostream>

using namespace std;

int main()
{
    int a=10;
    int b=20;

    const int* const p=&a;
    cout<<p<<endl;
    cout<<*p<<endl;
    
    return 0;
}

特点:指针指向和指向的值都不可以修改

(四)指针和数组

#include <iostream>

using namespace std;

int main()
{
    int array[10]={1,2,3,4,5,6,7,8,9,10};

    int* p=array;					//数组名就是地址
    for(int a=0;a<10;a++)
    {
        cout<<"hello world"<<*p<<endl;
        p++;						//地址+1不是按1个字节加的,而是8个字节(针对64位)
    }
    return 0;
}

(五)指针和函数

#include <iostream>

using namespace std;

void swap1(int a,int b)
{
    int temp=a;
    a=b;
    b=temp;
    cout<<"a地址"<<&a<<endl;
    cout<<"b地址"<<&b<<endl;
}

void swap2(int *a,int *b)
{
    int temp=*a;
    *a=*b;
    *b=temp;
}

int main()
{
    int x=10;
    int y=30;

    cout<<"x数值"<<x<<endl;
    cout<<"y数值"<<y<<endl;
    cout<<"x地址"<<&x<<endl;
    cout<<"y地址"<<&y<<endl;

    swap1(x,y);
    cout<<"x数值"<<x<<endl;
    cout<<"y数值"<<y<<endl;

    swap2(&x,&y);
    cout<<"x数值"<<x<<endl;
    cout<<"y数值"<<y<<endl;

    return 0;
}

输出

x数值10
y数值30
x地址0x7ffe05e9c850
y地址0x7ffe05e9c854
a地址0x7ffe05e9c82c
b地址0x7ffe05e9c828
x数值10
y数值30
x数值30
y数值10

1.swap1函数,值传递,形参不影响实参,为形参独立分配内存空间(从输出中可以看出a的地址和x的地址不一样,说明调用函数时为形参开辟新的内存单元)
2.swap2函数,地址传递,可以交换值

发布了35 篇原创文章 · 获赞 4 · 访问量 4025

猜你喜欢

转载自blog.csdn.net/qq_42589654/article/details/104263334