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类型的数组,建议被调函数的参数数组指针

cpp 复制代码
 //定义一个函数,从总成绩中求某个学生的成绩
 // 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

cpp 复制代码
 //需求:用一个指针数组,存储一组字符串,要求写一个函数,去除数组中的字符串
 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.如果需要将一个函数作为另一个函数的形参,建议将该函数的形参用函数指针表示

cpp 复制代码
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){...}

案例:

cpp 复制代码
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;//指针常量

结论:

  1. 指针常量的指向不能改变(不能给指针变量重新赋地址值)

  2. 指针常量的指向的数据可以改变。

注意:指针常量在定义时就要赋值;不能先定义后赋值,否则编译会报错

cpp 复制代码
 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指向的数据不能改变(地址对应的数据不可更改)

相关推荐
刚入门的大一新生几秒前
Linux-线程互斥
java·开发语言
香芋芋圆20 分钟前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
罗西的思考32 分钟前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
赵小哥要冲啦32 分钟前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
xiaogai_gai36 分钟前
采购业务退款单同步实战:从钉钉审批流到金蝶云星空付款单
java·数据库·钉钉
神也畏惧菠萝43 分钟前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
二哈赛车手1 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
ZWZhangYu1 小时前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
揽星河..1 小时前
【C语言】分支和循环
c语言·c++·算法