指针类型
#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++的人来说,只有好处