C/C++中的指针(*),引用(&),取地址(&)

大一学C++的时候最怕的肯定就是指针方面的知识了,相信大家也是有这样的体会,但是懵归懵,现在我们得弄清楚一下里面的东西,但想要理解的明明白白,还是需要下一些功夫进去的

指针的形象概念:

C/C++中的指针(*),引用(&),取地址(&)

假设第一个代表指针变量ptr,第二个代表整形变量h

第一个方框就是指针变量,指针变量存的内容是指向的变量的地址,所以我们会有如下指针: int  * ptr=&a;

然后我们使用的时候,*ptr==a这是为真的,这就是指针的最基础的概念

下面将给大家介绍各种指针的运用:

常量指针:定义方式:const int * ptr=&a;或者int * const ptr=&a;也是可以的。

常量指针的含义是指针不能修改指向的内存的值。也就是说:*ptr=1301是非法的,但是ptr=&b;是合法的

用途:可以用来作为读取的指针,不允许修改的时候使用

指针常量:定义方式:int const * ptr=&a;

指针常量的含义是指针不能再指向其他内存,也就是说ptr=&b;是非法的,但是可以修改指向的内存的值

数组指针:定义方式:int (*ptr) [10];这里*ptr其实就是数组的名字,因为我们知道数组名其实就是一个内存地址

指针数组:定义方式:int * ptr[10];这里因为*优先级小于[ ],所以ptr先和[ ]结合了,所以就定义了一个指针数组

指针数组和数组指针的区别:

指针数组就是说:指针变量中存的是某个数组的首元素的地址

数组指针就是说:数组中每个元素都是一个指针变量,也就是说每个元素还可以指向一个其他内存(比如创建一个新数组),创建二维数组其实就是这样来的。

创建二维数组:int ** ptr=new int [10];ptr[0]=new int [10]...

这样就创建了一个10x10的二维数组了。

函数指针:int (*funname)(int ,int);这里声明的是一个返回值为整型,参数为两个整型参数的函数原型

但是函数指针要怎么用呢?其实在C++的虚函数就是通过函数指针来实现的,虚函数又与多态密切相关。

具体用法我简单介绍一下:当我们写了一个函数,里面有一个处理过程需要调用另一个函数来实现,但是有多种实现这个过程的方法,这时候我们只需要传递相应的函数指针进到这个主调函数就行了,这就是回调函数

 

int add(int a,int b)

{

       cout<<a+b;

       return (a+b);

}

回调函数怎么实现:

int main_call(int (*funame)(int ,int ));//这个主调函数就可以传不同的函数进去执行

 

funname=add;//这里不要对add取地址,因为函数名就像一个数组名一样本身就是一个地址,同样的还有字符串也是如此

调用:int a = funname(4,5);或者int a = (*funname)(4,5);都行的,这里其实是因为两种观点的历史原因

当然还有扩展的,结合前面的指针数组数组指针组成函数指针数组  和   指针函数指针数组。

比如:int (*ptr[2])(int ,int );这里声明的是一个包含两个函数指针元素的数组

而int ((*ptr)[2])(int , int )则是指向数组的指针,数组中的两个元素应为函数名,但是谁又能保证呢

而int (*(*ptr)[2])(int , int);则是合法的,表示是一个指向      函数指针数组     的指针  

如果typedef int (*funname_ptr)(int ,int );代表什么意思呢?

typedef在我往期的博客中有介绍,这里就是说定义了一个函数指针的类型的别名;我们可以这样定义一个函数指针了,funname_ptr ptr1=add;

指针函数:int * funname(int ,int );其实就是返回值是一个指针类型的函数;使用时:int *a = funname(4,5);

 

引用和取地址的区别:

引用是在C++中才有的概念,而取地址则是在C/C++中都有。

首先讲讲引用:

 

C/C++中的指针(*),引用(&),取地址(&)

引用就类似于python中将变量与数值挂钩的理念,图中a和b的值相同并且地址也是相同的

但是引用必须在使用之前进行初始化,int &b=a;并且进行绑定之后就不能进行修改了

取地址:

就是单纯的去某个变量在内存中的地址,或者是逻辑地址(有关虚拟内存技术)

博客写出来方知自己的不足,上面其实还有一些不足,但是现在期末考试紧张,回家好好研究一番再来更改