C++ 03 指针与引用

 

指针类型

#include <iostream>


int main(){
    int i = 1;
    int* a = &i;
    int *b = &i;
    int * c = &i;
    std::cout << "a="<<a << std::endl; // a=0x7ffeb29cf6ac
    std::cout << "b="<<b << std::endl; // b=0x7ffeb29cf6ac
    std::cout << "c="<<c << std::endl; // c=0x7ffeb29cf6ac
    return 0;
}

 

对于一个数据类型来说,星号的位置不重要,但实际上应该将指针的声明看作一种类型的声明,即将指针看作一种特殊的类型,指针类型

那么星号的位置应该靠近具体的数据类型,比如整形int,星号应该与int写在一起:int* a

 

指向函数的指针

int  *add(int a, int b);

 

返回指针的函数

int*  add(int a, int b);

 

引用

让两个变量都指向同一地址的数据,或者说把一个变量的地址赋予另外一个变量

#include <iostream>

int main(){
    int a = 1;
    int &b = a;
    int& c = a;
    b = 2;
    printf("a=%d,b=%d,c=%d\n",a,b,c); // a=2,b=2,c=2

    c = 3;
    printf("a=%d,b=%d,c=%d\n",a,b,c); // a=3,b=3,c=3
    return 0;
}

&是取地址没错,但这里说的是引用,要定义一个变量的,这个变量也是个特殊的变量,所以同指针一样,应该将引用看作一个类型,即引用类型

即是类型,虽然语法上不要求&的位置,但它应该与数据类型int写在一起,即平时应该写成int& a

将int&看作一个整体,看作一个类型,用这个类型,就可以得到一个引用变量

 

指针与引用的不同

引用定义的变量与原变量本身没有任何不同,

int a=1;int& b=a;

假如a的地址是0x7ffeb29cf6ac,那么在编译阶段,a的位置会被替换为0x7ffeb29cf6ac,

b也一样,在执行时,它们完全相同,

唯一的不同就是在编码时我们看到的符号字母的不同,它们所代表的地址与地址指向的内容皆相同。

 

int* a=&b; 在这里,&不是一个变量类型,而是取地址符号,表示将变量b的地址赋予变量a,

它们的不同,实际上就这一点,一个是指向 变量地址所指,一个是指向 变量的地址

 

后续皆多变化,实际是

数据存储方式,比如,数据都是按字节来计算单位的,int 4字节,并且地址相连,数组的地址都是相连的,

地址定义格式,比如是16进制数字,这一点决定了地址可以其他数字一样可以加,可以减,但由数据的定义可知,一次加减是一个数据的字节长度,

 

指针在c++中非常非常重要,实际上指针与引用就这么一个不同之处,所以要掌握指针,实际是指,要掌握:

变量在内存中的存储方式,具体是逻辑存储方式

程序运行过程中,编译,执行两个阶段的后台逻辑是什么

程序背后,计算机CPU, 寄存器,内存堆与栈...等操作系统这个级别是如何运转的,

 

玩转指针,差不多就操作系统入门了,当然了,操作系统也是汇编,c/c++写的,学学操作系统对搞c/c++的人来说,只有好处

上一篇:web面试篇-js


下一篇:面向对象03-属性与方法