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

相关推荐
棋丶2 分钟前
VUE2和VUE3的区别
开发语言·前端·javascript
Q_19284999067 分钟前
基于Spring Boot的爱记笔记网站
java·spring boot·后端
Q_192849990611 分钟前
基于Spring Boot的仓库租赁管理系统
java·spring boot·后端
勤劳的进取家11 分钟前
区别:支持向量机 (SVM) 和逻辑回归
算法·支持向量机·逻辑回归
萌の鱼12 分钟前
leetcode 2279. 装满石头的背包的最大数量
数据结构·c++·算法·leetcode
Pandaconda22 分钟前
【Golang 面试题】每日 3 题(二十三)
开发语言·后端·面试·golang·go·channel
等一场春雨22 分钟前
linux 查看 MySQL 在 Linux 或 WSL 上的运行状态
linux·mysql·adb
sun00770025 分钟前
C++中,typename
开发语言·c++
栗筝i37 分钟前
Maven 中的依赖管理机制
java·maven
Conmi·白小丑38 分钟前
Conmi的正确答案——Maven加载时检测到的漏洞修复
java·maven