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

相关推荐
m0_555762901 分钟前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
学不动CV了18 分钟前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
大千AI助手24 分钟前
DTW模版匹配:弹性对齐的时间序列相似度度量算法
人工智能·算法·机器学习·数据挖掘·模版匹配·dtw模版匹配
典学长编程25 分钟前
Linux操作系统从入门到精通!第二天(命令行)
linux·运维·chrome
wuk99840 分钟前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
DuelCode1 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
浪裡遊1 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
优创学社21 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
幽络源小助理1 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring