C++_01

杂识01



01编译过程:

.cpp

.ii(预处理文件) g++ -o HelloWorld.ii -E HelloWorld.cpp

.s(汇编文件) g++ -o HelloWorld.s -S HelloWorld.ii

.o(目标文件) g++ -o HelloWorld.o -c HelloWorld.s

.exe(二进制文件) g++ -o HelloWorld.exe HelloWorld.o

HelloWorld



02指针

值为内存地址的变量

内存的修改器

间接获取数据

使用变量名 -> 直接获取数据

int * ptr :整型指针ptr


两种理解:

int* p: p地址变量,表示0x地址;声明定义

int *p: *p整型变量,表示一个整型值

声明和使用,“*”含义完全不同

&

取地址符

——取地址的好处直接找到该对象,修改值

int num = 1024;
int * ptr_num ;

//取num变量的地址,赋值给ptr_num
ptr_num = #

*

间接运算符

int num = 1024;
int * ptr_num;  //* ->定义
ptr_num = # //ptr_num = num的地址

*ptr_num = 1111; //num = 1111
//* ->间接取值
//根据你的地址,找到你的空间值

指针 == 名片

取地址==查水表



实例

#include <iostream>

using namespace std;

int main()
{
    double num = 1024.5;
    //声明一个指针,指向num变量 
    double * ptr_num = &num;
    //ptr_num = &num;

    cout << "ptr_num的值" << ptr_num<< "\t" << &num  << endl;
    cout << "ptr_num指向空间的值是:" << *ptr_num <<endl;


    return 0;
}

思考:

#include <iostream>

using namespace std;

int main()
{
    char ch = 'a';              //ch字符,&ch字符串
    char * ptr_ch = &ch;        //不用&会报错

    /*cout << ptr_ch << endl;       //以字符串的形式打印字符*/
    cout << (void *)ptr_ch << endl; //强转成字符指针类型
    cout << *ptr_ch << endl;

    return 0;
}

char * 默认后面赋值给它的是字符串



nullptr

  • 默认值为0

最危险的用法就是不赋值

double * ptr_double = nullptr;
  • 野指针 -> 避免

  • 及时正确释放

用法

int * ptr1 = nullptr;

int * ptr2 = 0;

int * ptr3 = NULL;
  • 尽量定义了对象之后再定义指向它的指针


void *

指向任意类型的指针

#include <iostream>

using namespace std;

int main()
{
    double objNum = 3.14;
    double * ptr_obj; ptr_obj = &objNum;

    cout << objNum << "\t\t" << &objNum << endl;
    cout << *ptr_obj << "\t\t" <<ptr_obj << endl;


    //cout << boolalpha;
    void * vptr_obj; vptr_obj = &objNum;
    cout << (ptr_obj == vptr_obj) << endl;

    return 0;
}
  • void* -> 存放一个内存地址,地址指向的内容是不能确定的
  • 不可以用 void* 定义一个指针
  • 一般用来和别的指针比较,或作为函数参数


指针小结

  • 指针是变量,指针是地址
  • 普通变量 :指针 -> 对象 :指针
  • 指针不可以和现有变量同名
  • 指针可以指向数组、结构体、共同体等高级数据结构


03引用

为对象起绰号

int int_value = 1024;

//reValue指向int_value,是int_value的另一个名字
int& reValue = int_value;

引用必须被初始化

指向常量的引用是非法的

const double& ref = 100;    //合法

本质还是指针,是封装了的指针;

#include <iostream>

using namespace std;

int main()
{
    int num = 108;
    int& rel_num = num;
    rel_num = 118;

    cout << num << "\t" << rel_num << endl;
    cout << rel_num << "\t" << &rel_num << endl;

    return 0;
}

指针和数据的区别

#include <iostream>

using namespace std;

int main()
{
    double score[] = {11,22,33,44,55};
    double * ptr_score = score;

    cout << sizeof(score) << "\t" << sizeof(ptr_score);
    //8*5=40;4

    return 0;
}

==指针
指针类型任何时候都只占4个字节

原文链接: https://www.cnblogs.com/qianchanglai/p/12614938.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++_01

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/339111

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午11:56
下一篇 2023年3月1日 下午11:56

相关推荐