数据单位的访问方式:
直接存取:
按照变量地址存取变量值的方式
间介存取:
将变量i的地址放在另外一个变量中,可以通过特殊的变量专门存放这些地址(指针)
指针变量和变量的指针:
一个变量的地址称为该变量的指针,
如果一个变量专门存放地址的,称为指针变量
定义指针变量:
(基类型)指针类型:
指针类型就是指向变量的数据类型
一般形式:
基类型 *指针变量名;
变量名前加*代表改该变量时指针变量
注意事项
1.定义指针变量时要指定基类型
2.一个变量的指针代表着该数据的地址,和数据类型
3.指针类型,数据类型 *
4.不能用整数给指针变量赋值
赋值方法:int*i=&i;
5.一个指针变量只能指向同类型的变量
6.描述指针要说清楚是指向什么数据类型的指针变量:
int*i=&i;
i是指向整型数据的指针变量
指针变量有关的运算符& * *p是值 p是地址
&:取地址运算符
*:指针运算符
例如:
int a=10;
int *i=&a;
cout<<a<<*i;
输出结果相同
***&和*的优先级相同,但是计算时按照自右而左结合
*&a;///先取a的地址然后在*运算,所以*&a==a;等价
指针做函数参数
void awap1(int *p;int *p1){
int a=0; c++变量要赋予初始值不然会破坏程序
a=*p;
*p=*p1;
*p1=a;
}
注意事项:
1.指针做形参属于地址传递
2.实参要是地址才能被指针承接
3.不要试图改变形参指针变量来改变实参指针变量的值 就是说不能交换地址,改变数据位置
void awap1(int *p;int *p1){
int *a;
a=p;
p=p1;
p1=a;
}
操作完成后没有任何变化p和p1内的数据没有任何变化
数组和指针
int a[3]={0,1,2};
指向数组元素的指针
int *p=&a[0];
指向数组的指针
int*p=a;
nt*p=&a[0];
二者相同
因为数组时说过数组名就是数组的首地址就是第一个元素位置:
指针指向下一个元素:
如果指针已经指向一个元素只要p+1即可指向下一个元素
操作语句
p++;
引用数组元素方法:
1.下标法 a[i]
2.指针法 *(p+i)
注意
指针变量指向数组元素时,用指针访问元素时要尽量避免访问超过长度,虽然合法编译时不会爆i错但是会得不到预期效果
指针作为形参承接数组地址
数组名为数组的首元地址,用数组名作为函数的参数,传递的是数组的首元素地址
*****c++中编译系统会把形参数组名一律作为指针变量来处理****
int swap1(int *p,int n)==int swap(int aeet[],int n)
两个函数等效且都是地址传递
因此在函数调用时不会存在形参数组只会有指针变量
字符串和指针
1.字符串和字符数组
char str[]='"hello";
2.字符串变量和字符串
string str='"hello";
3.指针变量和字符串
char*str='"hello";
实际上就是吧字符数组的第一个元素位置给了指针,在访问时,指针会++,直到指向系统添加的'\0'结束访问
函数和指针:
概念:
函数的入口地址就是函数的指针
一般形式:
函数类型 (*变量名)(参数列表)
例如
int max(int a,int b);
int (*p)(int a,int b);//定义指向函数的指针变量p
p=max;
p(a,b);//max(a,b)等效
常指针和指向常量的指针(重点)
int const*p;:常指针,指针的指向不能变
const int*p指向常量的指针变量,不能通过指针p改变指向对象的值
指针运算重点
1.指针-+整数:
也就是指针在一个连续的内存中往后移或往前进
2.指针-指针:可以得到这两个指针之间一共多少元素
前提:空间连续(数组)
常用来求数组内元素的个数
3.指针变量可以指向为空NULL
指向为空不等于没有指向,如果指针变量没有初始值,他会乱指,相当的危险,所以一般我们会引用指针变量之前先赋值
4.两个指针比较
前提两个指针指向同一个数组,则可以比较,后面元素的指针大于前面元素指针
5.指针赋值
同类型赋值
引用
概念:
引用在c+中就是给变量起一个别名
一般形式:
数据类型 &别名=变量名;
int&b=a;
b就是a的别名
注意事项:
1.引用是独立的数据结构,引用只有声明,没有定义
2.声明一个引用时,必须同时使之初始化,说明指向那个变量
3.声明一个变量之后,不能再让它成为别的变量的别名
4.不能引用数组和指针
5.不能别名的别名
6.可以去引用的地址,别名的地址和原名地址一样
7区别不同的地方取地址还是起别名
int&b=a;
int *p=&a
***引用可以理解为指针但又不同*,至少在引用做参数和指针参数是一致的**可以自行查阅
引用作为函数参数
int main(){
int max1(int*p1,int *p2 );
int max2(int&p1,int &p2 );
int a=10;int b=20;
max1(&a,&b);
max2(a,b);
return 0;}
max1和|max2都是地址传递方式,引用更为方便一些,减少了解引用的操作,更为简单