C语言基础:指针(常量指针和指针常量)
main函数原型
定义:main函数有多种定义格式,main函数也是函数,函数相关的结论对我们main函数也有效(也可以定义main函数的函数指针)
main函数的完整写法:
int main(int argc,char *argv[]){} int mian(int argc,char **argv){}
扩展写法:
main(){} 等价 int main(){} int main(void){} void main(){} void main(void){} void main(int a){}
说明:
1. argc,argv是形参,它们俩可以修改
2. main函数的扩展写法有些编译器不支持,编译报警告
3.argc和argv的常规写法:
· argc:存储了参数的个数
· argc:存储了所有参数的字符串形式
4.main函数是系统通过函数指针的回调形式调用的
建议:
1.如果一个函数需要返回数组,建议将这个函数定义成指针函数(返回值为指针的函数)
2.如果一个被调函数需要接收主调函数传递一个非char类型的数组,建议被调函数的参数数组指针
//定义一个函数,从总成绩中求某个学生的成绩 // n:索引,表示某个学生 ,arr : 数组指针,表示总成绩 float* get_score(float (*arr)[4],int n) { float *pt = *(arr+n);//arr[n],*(arr+n)下标法和指针法 return pt; } int main() { //创建一个二维数组 float scores[3][4]={66,77,88,55,44,66,77,88,99,88,77,99}; float *p = get_score(score,1); printf("%5.2f\n",*(p+2)); return = 0; }
3.如果一个被调函数的参数是一个字符数组
{"aaa","bbb",...}
,建议将参数类型定义为字符指针数组char *arr[]
或者字符二级指针char **arr
//需求:用一个指针数组,存储一组字符串,要求写一个函数,去除数组中的字符串 char* get_str(char **p,int n) { return *(p + n); } int main() { char *arr[3] = {"hello","allalal","aaaaaa"}; char *str = get_str(arr,1); printf("%s\n",str); }
4.如果需要将一个函数作为另一个函数的形参,建议将该函数的形参用函数指针表示
int add(int a,int b){return a+b;} int jisuan(int a,int b,int (*ADD)(int,int)) { printf("开始计算:\n"); ADD(a,b); } int main() { int a = 5,b = 3; jisuan(a,b,add); return 0; }
常量指针与指针常量
常量:分为字面量和只读常量,字面量就是我们平时直接操作的量:printf("%d\n",12);printf("%s\n","hello");只读常量使用关键字const修饰,凡是被这个关键字修饰的变量,一旦赋值,值就不能改变。
语法:
//字面量 printf("%d\n",12); //只读常量 const int a = 10; a = 21;//编译错误,因此此时这个变量是只读常量,所以不可更改其值
常量指针
定义:常量的指针,本质是一个指针,指针指向的数据不能改变。
定义格式:
const 数据类型 *变量名;
举例:
const int *p;//p就是常量指针
结论
1. 常量指针指向的数据不能改变(不能解引用间接修改数据) 1. 常量指针的地址可以改变(指向是可以改变的)。
应用场景:作为形式参数,实际参数需要给一个常量。
void foreach(const int *array,const int len){...}
案例:
int main()
{
//定义变量
int a =10;
//定义常量指针
const int *p = &a;
// *p = 100;//编译报错,常量的值不能被改变
printf("%d\n",*p);//10
//定义变量
int b = 20;
p = &b; //编译通过,常量的地址可以被改变
printf("%d\n",*p);//20
return 0;
}
指针常量
定义:指针的常量,指针的指向不能改变
定义格式:
数据类型* const 变量名;
举例:
int* const p;//指针常量
结论:
-
指针常量的指向不能改变(不能给指针变量重新赋地址值)
-
指针常量的指向的数据可以改变。
注意:指针常量在定义时就要赋值;不能先定义后赋值,否则编译会报错
int main()
{
//定义变量
int a =10;
//定义常量指针
int * const p = &a;
*p = 100;//编译通过,常量的值能被改变
printf("%d\n",*p);//10
//定义变量
int b = 20;
//p = &b; //编译报错,常量的地址不可以被改变
printf("%d\n",*p);//20
return 0;
}
常量指针常量
定义语法:
const 数据类型 *const 变量名;
举例:
const int * const p;
作用:p的指向不能被改变(地址不可更改),p指向的数据不能改变(地址对应的数据不可更改)