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

相关推荐
看到我,请让我去学习34 分钟前
Qt— 布局综合项目(Splitter,Stacked,Dock)
开发语言·qt
GUET_一路向前1 小时前
【C语言防御性编程】if条件常量在前,变量在后
c语言·开发语言·if-else·防御性编程
曳渔1 小时前
UDP/TCP套接字编程简单实战指南
java·开发语言·网络·网络协议·tcp/ip·udp
楼田莉子1 小时前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
三千道应用题1 小时前
WPF&C#超市管理系统(6)订单详情、顾客注册、商品销售排行查询和库存提示、LiveChat报表
开发语言·c#·wpf
hqxstudying1 小时前
JAVA项目中邮件发送功能
java·开发语言·python·邮件
咪咪渝粮1 小时前
JavaScript 中constructor 属性的指向异常问题
开发语言·javascript
最初的↘那颗心1 小时前
Java HashMap深度解析:原理、实现与最佳实践
java·开发语言·面试·hashmap·八股文
小兔兔吃萝卜1 小时前
Spring 创建 Bean 的 8 种主要方式
java·后端·spring
pusue_the_sun2 小时前
数据结构——栈和队列oj练习
c语言·数据结构·算法··队列