C++中的指针、数组指针与指针数组、函数指针与指针函数

简介: <h1 style="text-align:center">C++中的指针、数组指针与指针数组、函数指针与指针函数</h1> <div style="text-align:center"><br></div> <br><p>本文从初学者的角度,深入浅出地详解什么是指针、如何使用指针、如何定义指针、如何定义数组指针和函数指针,并给出对应的实例演示;接着,区别了数组指针与指针数组、函数指针

C++中的指针、数组指针与指针数组、函数指针与指针函数



本文从初学者的角度,深入浅出地详解什么是指针、如何使用指针、如何定义指针、如何定义数组指针和函数指针,并给出对应的实例演示;接着,区别了数组指针与指针数组、函数指针与指针函数;最后,对最常混淆的引用传递、值传递和指针传递做了区处。


C++中一个重要的特性就是指针,指针不仅具有获得地址的能力,还具有操作地址的能力。指针可以用于数组、或作为函数的参数,用来访问内存和对内存的操作,指针的使用使得C++很高效,但是指针也非常危险,使用不当会带来比较严重的问题。


1、指针


程序中所有的变量和常量都存在一个内存地址中,当然,函数也有对应的内存地址,内存地址的不同会导致程序执行时有所不同。


指针就是用来控制和存储内存地址的变量,它指向单个对象的地址,除了void之外,指针的数据类型与所指向地址的变量数据类型保持一致。


2、如何定义指针、数组指针、函数指针


常见的指针定义有3种:变量指针、数组指针和函数指针的定义。


(1)、变量指针的定义


int* p=0;	//定义指针p,并初始化指针为0,即指向的地址为0000 0000
或
int a=0;	//定义初始化常量a
int* p;	//定义指针p
p=&a;	//指针p指向a的地址,即指针获取地址


(2)、数组指针的定义


int a[]={0,1,2,3,4,5,6,7,8,9};	//定义数组
int* p=a;	//定义并赋值数组指针,即获得数组的首地址


(3)、函数指针的定义


int f();	//定义函数
int (*p)();	//定义函数指针
p=f;	//赋值函数指针,即获得函数代码的首地址
 


区别变量指针、数组指针和函数指针的定义的示例代码如下。


#include<iostream>
using namespace std;

int f()	//定义一个函数
{
	cout<<"测试函数指针的使用"<<endl<<endl;
	return 0;
}

void main()
{
	cout<<"==========变量指针的使用=========="<<endl;
	int a=5;
	int* p=0;	//初始化指针为0
	int* q;		//定义指针
	q=&a;		//赋值指针
	cout<<"a = "<<a<<endl;		//变量a的值
	cout<<"a = "<<*q<<endl;		//变量a的值
	cout<<"p = "<<p<<endl;		//指针p的地址为0000 0000
	cout<<"&a = "<<&a<<endl;	//获取a的地址
	cout<<"&a = "<<q<<endl;		//获取a的地址

	cout<<"==========数组指针的使用=========="<<endl;
	int b[]={0,1,2,3,4,5,6,7,8,9};
	int* pb=b;		//直接指向第一个元素的地址
	cout<<pb<<endl	//第1个元素的地址,即数组的首地址
		<<b<<endl	//第1个元素的地址,即数组的首地址
		<<*pb<<endl	//第1个元素的值
		<<(*pb+2)<<endl;	//第3个元素的值

	cout<<"==========函数指针的使用=========="<<endl;
	int f();		//定义函数
	int (*pf)();	//定义函数指针
	pf=f;			//赋值函数指针,即将函数的首地址赋值给指针pf
	(*pf)();		//通过函数指针调用函数
}

结果如下图:



3、数组指针与指针数组


数组指针是一个指针变量,它指向一个数组,即指向一个数组的指针就是数组指针;而指针数组是一个只包含指针元素的数组,它的元素可以指向相同类型的不同对象。


4、函数指针与指针函数


函数指针就是指向函数的存储空间地址的指针,可以对函数指针进行赋值并且通过函数指针来调用函数,它的本质是一个指针。而指针函数只是说明它是一个返回值为指针的函数,其本质是一个函数。


5、引用传递、值传递和指针传递


C++语言中,函数的参数和返回值的传递方式有3种:即值传递、引用传递和指针传递。


(1)、值传递


形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。



(2)、指针传递


形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。



(3)、引用传递


形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。


最后,总结一下指针和引用的相同点和不同点:


相同点:


都是地址的概念,指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。


不同点:


指针是一个实体,而引用仅是个别名;


引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;


引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有的,前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)


引用不能为空,指针可以为空;


“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;


指针和引用的自增(++)运算意义不一样;


引用是类型安全的,而指针不是(引用比指针多了类型检查)。



目录
相关文章
|
1月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
88 1
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
207 4
|
3月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
3月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
102 1
|
3月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
60 2
|
3月前
魔法指针 之 函数指针 回调函数
魔法指针 之 函数指针 回调函数
25 0
|
3月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
30 0
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
225 13
|
3月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
48 0
|
4月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
182 4