目录
一、函数传参的方式
1.值传递
- 值传递是单向的,只能把实参的值传给形参
- 在函数调用过程中,如果形参的值发生变化是不会影响到实参值
2.地址传递(指针传参)
- 在函数调用过程中,如果形参的值发生变化是不会影响到实参值
- 通过形参指针可以改变实参指针所指向的存储单元中的值
二、指针与一维数组
1.指向数组的指针
- 将数组名(其实就是数组的首地址)赋值给一个指针,该指针就是指向数组的指针
int a[5]={1,2,3,4,5};
int *p=a;//p就是指向数组的指针,p指向数组中的第一个元素
- 通过指向数组的指针可以操作数组中的元素
int a[5]={1,2,3,4,5};
int *p=a;
cout<<"a[1]="<<*(p+1)<<endl;//a[1]=2
*(p+2)=30;
cout<<"a[2]="<<*(p+2)<<endl;//a[2]=30
2.数组的遍历方式
- 下标法:引用数组元素可以通过下标找到对饮的元素并对其进行操作
- 指针法:通过指向数组的指针可以引用到所需的元素并对其进行操作
在编译时,编译器会将a[i]当成*(a+i)来编译(i为数组下标),因此数组就算越界也不会语法报错,但可能会造成不可预知的错误。
int a[5]={1,2,3,4,5};
int *p=a;
int i;
for(i=0;i<5;i++)//下标法
cout<<a[i]<<" ";
for(i=0;i<5;i++)//指针法
cout<<*(a+i)<<" ";
for(i=0;i<5;i++)//指针法
cout<<*(p+i)<<" ";
for(;p<(a+5);p++)//指针法
cout<<*p<<" ";
3.数组的传参方式
数组作为函数参数的四种传参方式:
void print_array1(int array[],int size);
void print_array2(int *ap,int size);
int main()
{
int a[]={1,2,3,4,5};
int *p=a;
int i;
print_array1(a,5);//实参是数组名,形参是数组名
cout<<endl;
print_array1(p,5);//实参是指针,形参数组名
cout<<endl;
print_array2(a,5);//实参是数组名,形参是指针
cout<<endl;
print_array2(p,5);//实参是指针,形参是指针
return 0;
}
void print_array1(int array[],int size)
{
int *p;
for(p=array;p<(array+size);p++)//指针法
cout<<*p<<" ";
}
void print_array2(int *ap,int size)
{
int *p;
for(p=ap;p<(ap+size);p++)//指针法
cout<<*p<<" ";
}
三、二级指针
- 二级指针(又称指针的指针)
- 二级指针指向另一个指针变量
- 二级指针的定义:** 二级指针变量 = & 一级指针变量
- 二级指针变量中存放的是一级指针变量的地址
int a=10;
int *p=&a;//一级指针存储的是一般变量的地址
int **pp=&p;//二级指针指向的是一级指针变量
cout<<"p="<<p<<endl;//p=0x6dfee8
cout<<"*p="<<*p<<endl;//*p=10
cout<<"pp="<<pp<<endl;//pp=0x6dfee4
cout<<"**pp="<<**pp<<endl;//**pp=10、等同于*(*pp)=10,指针运算符是右结合
if(pp==&p && *pp==p && **pp==a)
{
cout<<"pp==&p"<<endl;
cout<<"*pp==p"<<endl;
cout<<"**pp==a"<<endl;
}
if(*(&p)==p)
cout<<"*(&p)==p指针运算和取地址运算是反运算符"<<endl;
四、常量指针、指针常量、指向常量的指针常量
1.常量指针
- 指针本身即地址,可以被修改
- 通过该指针不可以修改它所指向的存储单元中的值
- 常量指针的定义:类型说明符 const *指针变量;
int a=10,b=100;
int const *p=&a;//不可以改所指向的存储单元的值,即不可以改a的值
cout<<*p<<endl;
p=&b;//但是指针本身可以被修改,可以让指针指向变量b
cout<<*p<<endl;
- 通过其他指针还是可以修改常量指针所指向的存储单元中的值
int b=100;
int const *p=&b;
int *p2=&b;
cout<<*p<<endl;
// *p=5;//error:assignment of read—only location '*p',通过该指针不可以修改它所指向的存储单元中的值
*p2=5;//其他指针还是可以修改*p所指向的存储单元中的值
cout<<*p2<<endl;
2.指针常量
- 指针本身即地址,不可以被修改
- 通过该指针可以修改它所指向的存储单元中的值
- 指针常量的定义:类型说明符 * const 指针变量;
int a=6;
int b=66;
int * const p=&a;
//p=&b;//error:assignment of read—only location '*p' 指针本身即地址,不可以被修改
cout<<*p<<endl;
*p=77;
cout<<*p<<endl;
- 定义一个二阶指针,让二级指针指向指针常量,从而修改指针常量(但是会出现警告)
3.指向常量的指针常量
- 指针本身即地址,不可以被修改
- 通过该指针不可以修改它所指向的存储单元中的值
- 指向常量的指针常量定义:类型说明符 const * const 指针变量;
int a=6;
int d=7;
int const * const cpi=&a;
*cpi=8;//error
cout<<*cpi<<endl;
cpi=&d;//error