3.1指针
3.1.1 指针变量的定义
- 指针变量的定义格式:
<指针类型> *<指针名>;
例:int *p ;定义一个名为p的指针变量,改变量指向的存储空间只能存放整形数
int (*pf) ( ); pf是一个指向函数的指针,该函数的返回值为int型数值
注:int *p,p2;定义了一个整型的指针变量和一个整型的变量
int *p1, *p2 ; 定义了两个整型的指针变量 - 指针变量的赋值
例:int *p=&x; 指针变量指向存储变量x的地址
// 也可用下面的方式来进行指针变量的赋值
int *p;
int x;
int p=&x;
例:double Fun(double x,double y);
double (*pf)(double,double);
pf=Fun; //pf是一个指向函数Fun()的指针,将函数Fun()的首地址赋给pf - 指针变量的运算
例:int x;
int *p=&x;
*p=40; //通过指针改变变量的内容
例:double Fun(double x,double y);
double (*pf)(double,double);
pf=Fun;
pf(a,b,c); //通过指向函数的指针来调用函数
指针变量的加减运算
int p;
int n;
。p+n;
此处的p+n,不是简单的把n直接加到p上,而是p+4n,4这个乘数因子就是指针类型在实际存储时所占单元的个数,int型4个字节,char型1个字节,double型8个字节。即p+n的操作可看成将指针向后移动n个指针变量型的数。
注:无论指针进行何种运算,所产生的地址不能是无效的或危险的地址,且指针的访问操作必须有意义。
3.1.2 指针的指针
二级指针的定义格式
<指针类型> *<指针类型>;
定义几级指针就在指针名前加几个
例: int *p1=&x, **p2=&p1,***p3=&p2;
不建议在编程中使用多级指针
3.2 指针与数组
如果对程序的运行有速度要求,使用指针表式数组中的元素要比用下标表式处理起来更快。- 一维指针与数组
C++中任何一个数组的名字都是指针常量,该指针的值便是该数组首元素的地址值。 - 二维指针与数组
例:double x[3][2];
二维数组元素表达方式:
(1)((x+i)+j) 行列数组均用指针表式
(2)x[i][j] 数组表式
(3)(x[i]+j) 行数组用下标表式
(4)((x+i))[j] 列数组用下标表式 - 三维数组的指针表示
例:double x[3][2][4];
三维数组元素表达方式:
(1)(((x+i)+j)+k) 行列组均用指针表示
(2)((x[i]+j)+k) 行数组用下标表示
(3)(((x+i)[ j])+k) 列数组用下标表示
(4)((*(x+i)+j))[k] 组数组用下标表示 - 指向数组的指针
定义格式:
<指针类型>(< *指针名 >)[<大小>]
例:int (*p)[5]; //定义一个指向含有5个元素的一维数组的指针p
int (*p)5;//定义指向数组a的指针 - 指针数组
定义格式:
<类型> *<数组名> [c1] [c2]…[cn];
有几个“[ ] ”就表示几维的指针数组
例:int *p[3] //定义一个包含三个整型指针变量的数组
char *string[]={“abc”,”def”,”ghi”} /string指针数组有三个元素,每个元素是一个char型指针,其初值分别是“abc”,”def”,”ghi”的首地址。/
3.3 字符串
3.3.1 C风格字符串-
C风格字符串初始化
1) char str[4]={‘y’,’p’,’o’,’\0’}; //手动添加结束符
2) char str[4]=”ypo”; //自动添加结束符
3) char *p=“ypo” // p指向字符数组的指针,通过对指针的递增和递减来进行逐个访问字符串中的字符
2.C 风格提供的字符串函数
注:使用时要包含string.h
1)字符串长度函数strlen()
int strlen(const char *s);
说明:返回字符串s的长度,不包含字符串结束符’\0’
2)字符串比较函数strcmp()
int strcmp(char *s1,char *s2)
说明:比较字符串s1与字符串s2是否相等,如果相等函数返回值为0;如果s1>s2,则函数返回大于0的值,如果s1<s2,则函数返回小于0的值。
3)字符串联接函数strcat()
char *strcat(char s1,chars2); 说明:s2添加到s1后面,返回该新字符串。
char *strcat(char s1,chars2,int n); 说明:在s1后面仅仅连接s2所指字符串的前n个字符串。
4)字符串拷贝函数strcpy()
char *strcpy(char *s1,char *s2);说明:将s2所指向的字符串复制到s1 所指向的字符串中。
char *strcpy(char *s1,char *s2,int n);说明:仅将s2所指向的字符串中前n个字符复制到s1中。
注:必须保证s1所指向的字符串能够容纳下s2所指向的字符串,否则产生错误。
3.string类型
string类型能自动根据文本大小确定相应的存储空间,故用string类型定义的字符串末尾不需要使用‘\0’作结束符。
例:string str=”lxs”; 字符存储长度为3;
char str[]=”lxs”; 字符存储长度为4;
string类型函数
(1)clear()清空成零长度的值
(2)empty()判断字符串是否为空
(3)length()返回字符串的个数
(4)c_str()建立一个风格的字符串常量
(5)swap()交换两个字符串中的内容
C++中的string类型,可以对文本信息更方便和更安全的处理。
C风格字符串执行速度快,使用C字符串更合适
3.4 引用
C++独有数据类型,引用是对一个变量或常量标识符起别名
引用格式:
<数据类型> &<引用名>=<变量名>
例:int a;
int & p=a;//声明p是对整数的引用,初始化变量为a,即定义a的引用p。
当编译程序时,看到&不会给后面的标识符分配存储空间,而是将所引用的那个标识符所具有的内存空间赋给它。引用对象和被引用对象地址一样,所以它们同步变化。
注:1)创建一个引用,该引用必须初始化
2)一旦一个引用被初始化指向一个变量,则它不能改变对另一个变量的引用
3)不能有空引用
4)不能对地址进行引用,例如不能对数组名引用
1.指针和引用的区别
1)对变量的操作方式不一样
p=10;//指针通过进行访问空间中的值。
int &p=a;
p=2;//引用直接访问。
2)指针是一个变量,指向一个空间后还可以指向其他空间,而引用只能一旦被初始化后,则不能改变。
2.优缺点:指针更加灵活,但容易发生错误,引用相当于更加高级封装,更加安全不容已发生错误,鉴于它只要被初始化就不能再改变,它灵活性不如指针。3.5 指针和引用在函数中的应用
1)做函数的参数
2)做函数的返回值
通过对函数的调用,函数返回一个值,可在很多情况下,为了让函数返回多个值,就可以使用指针和引用给给函数传递多个参数。
-
- 一维指针与数组