欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++指针小结

程序员文章站 2022-07-03 14:49:51
...

变量的指针即变量的地址,用来存放变量地址的变量是指针变量

  • 在定义指针变量时必须指定其基类型,而指针变量的基类型就是该指针变量指向的变量的类型,定义指针变量的一般形式:基类型*指针变量名
  • 基本类型可以用char,int,float等系统已经定义好的类型标识符来表示,指针类型应明确指出基类型
  • 不能用一个整数去给一个指针变量赋值
  • 一个指针变量只能指向同一个类型的指针
  • 说明指针类型时应完整描述,如a是指向整形数据的指针变量,或者int *型变量

引用指针变量

  • &:取地址运算符
  • *:指针运算符,也叫间接访问运算符
t1=&a;//假设t是已经定义过的int *型变量,则为把变量a的地址赋给t
t2=&b;
t2=&*t1;//作用为将b的地址赋给t2,换句话说&*t1与&a相同
  • 指针也可以用作函数参数,但由于虚实结合采用单向值传递,所以数据只能由实参传向形参,而形参值的改变无法传回给实参
  • 调用函数时不会改变实参指针变量的值,但可以改变实参指针变量所指向变量的值

指向数组的指针,所谓数组元素的指针即数组元素的地址,如指针变量p已经指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p=a是将a数组的首元素的地址赋给指针变量p

输出数组中元素又三种方法

  • 下标法
for(int i=0;i<n;i++)
	cin>>a[i];
for(int i=0;i<n;i++)
	cout<<a[i]<<" ";
  • 指针法,将下标法中的a[i]改为*(a+i)即可
  • 用指针指向数组元素
    注:指针变量p是被定义为指向整型的对象,可以指向整型的数组元素,也可以指向数组以后的内存单元

用指针变量作函数形参接收数组地址时,c++编译系统将形参数组名一律作为指针变量来处理,实际上在函数调用时并不存在一个占有存储空间的形参数组,只有指针变量。

c++中有三种方法访问一个字符串

  • 用字符数组存放一个字符串
char str[]="I am DaoZhang";
  • 用字符串变量存放字符串
string str="I am DaoZhang";
//需要用到头文件#include<string>
  • 用字符指针指向一个字符串
    char *str1=“I am DaoZhang”;

若用指针变量指向一个函数,则这个函数入口地址就称为函数的指针
指向函数的指针变量的一般定义形式为:
*函数类型(变量名)(函数形参表);

返回指针值的函数简称为指针函数
定义指针函数的一般形式为:
类型名*函数名(参数表列)

int *a(int x,int y);

若一个数组其元素均为指针类型数据,该数组称为指针数组(指针数组中的每一个元素都相当于一个指针变量)
一维指针数组的一般定义形式为:
类型名*数组名[数组长度]

int *p[4]//由于[]比*优先级高,所以p先与[4]结合,形成p[4]形式,再与p前面的*结合,表示该数组是指针类型的,每个数组元素都可指向一个整型变量
int(*p)[4]//指向一维数组的指针变量

指向指针的指针(指向指针数据的指针)

char*(*p)//定义p为指向字符型数据的指针变量(即字符指针变量)

const指针

  • 指向常量的指针变量,定义的一般形式为:
  • const 类型名 *指针变量名
    用指向常量的指针变量只是限制了通过指针变量改变它指向的对象的值,要保证a的值始终不变,应把a定义为常变量:const int a=12;
  • 常指针,指定指针变量的值是常量,即指针变量的指向不能改变
char *const p="Dao Zhang";//p是字符指针变量,其指向不能改变
p="Wang Ye";//试图改变p的指向,所以不合法
int a=4;
int b=6;
int *const p=&a;//规定p只能指向变量a
p=&b;//试图改变p的指向,所以不合法
  • 这种指针变量称为常指针变量,简称常指针,即指针值不能改变
  • 必须在定义时初始化,指定其指向
  • 指针变量的指向不能改变,但是指针变量的指向变量的值可以改变
*p=12;//合法
  • 若const在"*"之后,则应与定义指向常变量的指针变量的形式比较(const在类型名前面)

  • 指向常量的常指针,指针变量指向一个固定的对象,该对象的值不能改变(不能通过指针变量改变该对象的值)

  • const 基本类型名 *const指针变量名

void指针,指向空类型或者理解为不指向确定类型的数据

void *p;//p为无类型指针变量(基类型为void型)

可以把非void型的指针赋给void型指针变量,但不能把void型的指针直接赋给非void型的指针变量

指针数据小结

int i;//定义整型变量i
int *p;//定义p为指向整型数据的指针变量
int a[13];//定义整型数组a,它有13个元素
int *p[4];//定义指针数组p,由4个指向整型数据的指针元素组成
int (*p)[4];//p为指向包含4个元素的一维数组的指针变量
int f();//f为返回整型函数值的函数
int  *p();//p为一个返回指针的函数,该指针指向整型数据
int(*p)();//p为指向函数的指针,该函数返回一个整型值
int **p;//p是一个指针变量,它指向一个指向整型数据的指针变量
int const *p;//p是常指针,其值固定,即其指向不能变
const int *p;//p是指向常量的常指针,不能通过p改变其指向的对象的值
const int *const p;//p是指向常量的常指针,其指向不能改变,且不能通过改变其指向的变量的值
void *p;//p是一个指针变量,基类型为void(空类型),不指向具体的对象

指针运算小结

  • 指针变量加/减 一个整数
  • 指针变量赋值
  • 指针变量可以有空值,即该指针不指向任何变量p=NULL;
    p=NULL与p未被赋值是不同的概念,前者有值,不指向任何变量,后者虽然未对p赋值但不等于无值,而是其值是一个无法预料的值
  • 两个指针变量可以相减
  • 两个指针变量比较
  • 对指针变量的赋值应注意类型相同,若一定要对不同类型的指针变量赋值,可以使用强制转换