1 指针常量与常量指针
const关键字修饰指针变量会根据修饰的目标不同导致两种结果
1.1 指针常量
const修饰的是指针p
指针的指向不能修改,即该指针变量中保存的内容不可改。
p不能修改,*p可以修改
语法格式:
基类型* const 指针变量名
int main()
{
/*
const int a = 100;//只读变量,无法直接被修改
a = 19;
*/
int b = 88;
int c = 101;
//指针常量
int* const p = &b;//只读变量,无法直接被修改,p本身不可修改,p的指向不能变
*p = 99;
printf("%d\n", b);
//p = &c;
return 0;
}
1.2 常量指针
const修饰的是*p
指针的指向可以修改,即指针变量中保存的值可以改,但是指针所指向的空间中的内容是不可以改的
p可以修改,*p不能修改
语法
const 基类型* 指针变量名;
基类型 const * 指针变量名;
int main()
{
int a = 1;
int b = 2;
//const int* p = &a;
int const* p = &a;
p = &b;
*p = 9;//*p的数据类型是const int类型,p本身是可以随便指向,*p是不可直接修改的
return 0;
}
1.3常量指针常量
const既修饰p也修饰*p
指针的指向不可以修改,即指针变量中保存的值不可以改,同时指针所指向的空间中的内容也不可以改变
p不可以修改,*p也 不能修改
语法
const 基类型* const 指针变量名;
基类型 const * const 指针变量名;
2 void指针
2.1 void通常出现在函数的返回值类型声明。是指函数不需要返回,其次就是函数不需要接收参数时,形式参数列表可以用void填充int fun(void);
void类型也可以作为指针的基类型,目的是适配所有数据类型,因为void本身就是适配所有数据类型的意思,一个void类型的变量是无法声明的,因为void代表无类型。
因此使用void来充当指针变量的基类型,就可以让这个指针变量来存储任意变量的地址。我们也称这种类型的指针变量为“泛类型指针”
优点:可以接收任意变量的地址,也可以充当函数参数接收任意变量的地址;可以转换成任意基类型的指针类型,参与运算
综上所述:基类型是void的指针变量可以接收任意格式的地址,当使用void类型的指针变量时需要强制类型转换成其他具体的数据类型。否则会出风险。
3 指针变量充当函数形式参数
实际上就是将地址传递给形式参数,此时函数中的形式参数的这个指针也就指向了实际参数所在的空间,所以就可以通过形式参数来间接的修改实际参数的值
数组传参
函数的参数传递过程中,如果想要将数组当做参数传递给函数,编译器是无法实现的。因为数组空间比较大,如果要实现将整个数组进行参数传递,则需要耗费大量的空间由主调函数复制一个数组的备份交给被调函数。因此编译器并不会采取将整个数组进行传递的过程;而是将数组的首地址进行传递。
函数的调用时,如果要使用数组进行参数的传递,实际参数填入数组名(数组首地址),形式参数需要写一个指针,用于接收实际参数。