指针和函数的联用
- 一级指针作为函数的形参
- 二级指针
一级指针作为函数的形参
当函数的形参为数组时,我们定义函数如下:
语法:
数据类型 函数名(数据类型 数组名)
例如 :
void func(int a[],int a){
语句;
}
但是在实际使用中我们通常用指针的形式进行定义,这里的指针 a 表示数据是数组类型,例如:
void func(int *a,int n){
语句;
}
代码如下:
// 将数组的地址赋值给指针变量
int func(int *a,int n){
printf("wo%d",a[1]);
return 0;
}
int main(){
int b[] = {1,2,3,3};
int c = 10;
func(b,c);
return 0;
}
当我们调用函数时需要传递字符串,这是我们可以将函数中的参数类型设置为char *变量
代码如下:
// 将传过来的字符串变量的地址赋值给指针变量p
int func1(char *p){
printf("%c\n",p[0]);
return 0;
}
int main(){
func1("hello");
return 0;
}
提示:如果在函数的形参为指针时,我们一般会先对指针的值进行判断,判断指针的值是否为NULL。
二级指针
用一个指针变量保存一个一级指针变量的地址,这个指针我们称为二级指针。
语法:
数据类型 **变量名
示例如下:
int a = 10;
int *p = &a; // p为一级指针保存变量a的地址
int **pp = &p; // pp为二级指针,保存一级指针p的地址
这里可以把他想象成指针数组,将所有的指针变量(一级指针)放在一个数组里面,然后再将数组中的指针变量依次赋值给另一个指针变量(二级指针)。
代码如下:
int main(){
int a = 10;
int *p = &a;
int **pp = &p; // 指针pp保存了指针p的地址
printf("%d\n",*p);
printf("%d\n",**pp);
printf("%p\n",*pp); // 二级指针pp保存的地址
printf("%p\n",p); // 一级指针p的地址
// 这里就相当于
// &a == p == *pp
// a == *p == **pp
return 0;
}