首页 > 其他分享 >C语言基础:指针(常量指针和指针常量)

C语言基础:指针(常量指针和指针常量)

时间:2025-01-06 19:31:33浏览次数:9  
标签:const 常量 int 函数 C语言 main 指针

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;//指针常量

结论:

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

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

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

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

标签:const,常量,int,函数,C语言,main,指针
From: https://blog.csdn.net/weixin_51619876/article/details/144970338

相关文章

  • 10. C++对象模型和this指针
    1. 成员变量和成员函数分开存储在C++中,类内的成员变量和成员函数分开存储只有非静态成员变量才属于类的对象.classPerson{public:Person(){mA=0;}//非静态成员变量占对象空间intmA;//静态成员变量不占对象空间staticintmB;//函数也不占对象空间,所有函数共......
  • Go 语言中值传递与指针传递的选择之道
    目录Go语言中值传递与指针传递的选择之道一、Go中的传递本质二、如何选择传递方式1.遵循项目规范2.必须传地址的情况3.必须传值的情况4.可传值可传地址的情况三、值类型与引用类型1.值类型2.引用类型3.深浅拷贝四、方法接收器(Receiver)的选择在Go语......
  • 掌握C语言系列
    初识C语言之《C语言是什么?》1.1创始人——丹尼斯·里奇C语言是一种较早的程序设计语言,诞生于1972年的贝尔实验室。1972年,丹尼斯·里奇(DennisRitchie)设计了C语言,它继承了B语言的许多思想,并加入了数据类型的概念及其他特性。1.2简述C语言程序设计语言实与编译器......
  • C语言冒泡排序教程简介
    冒泡排序(BubbleSort)是一种简单的排序算法,因其工作原理像气泡一样逐渐上浮而得名。其基本思想是通过一轮一轮地比较相邻的元素,将较大的元素逐步“冒泡”到数组的尾部。在本篇博客中,我们将详细讲解冒泡排序的基本概念,如何在C语言中实现冒泡排序,并提供一些示例来帮助大家理解。......
  • AcWing 799:最长连续不重复子序列 ← 双指针
    【题目来源】https://www.acwing.com/problem/content/801/【题目描述】给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。【输入格式】第一行包含整数n。第二行包含n个整数(均在0∼10^5范围内),表示整数序列。【输出格式】共一行,包含一个......
  • C语言指针数组在字符串的实例
    还记得指针数组吗?(一堆指针组成的数组)我们当时推荐字符串用这一块的内容,因为一句话可以用指针代替然后用指针数组组合在一起成为一个语句组成的的矩阵(总之就是攒在一起了方便操作),这一节也建议回顾一下字符串这一块,和string函数库基本格式与录入输出我们首先要创建一个指针数......
  • C语言结构体
    结构体很简单,就是结构,我们学过哪些结构?数组、指针数组等等能把一堆数据有结构、条例的组合在一起并且修改调用的,这块也是一个重要思维或者说分支,不亚于模块化(函数、文件)逻辑(逻辑条件),因此有些学校的编程课叫数据结构,就是因为它和c语言密不可分(尤其是c是内存操作的语言),数据结构......
  • C语言(自定义)函数
    函数概念函数可以分为函数库(预制菜)和自定义函数(自己做的菜)函数库之前的文章讲解过一部分数组的、字符串的、动态内存的,有兴趣可以我的学习专栏看一看,里面都有今天重点讲解的函数是自定义函数先来几道预制菜输入/输出函数(头文件为stdio.h):用于完成输入/输出功能;(最基本的)字......
  • C语言语法练习1(较简单)
    一、题目来源注意:题目来自牛客网链接:【新手上路】语法入门+算法入门题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网二、部分题目的解1、#include<stdio.h>intmain(){doublea,b,c;scanf("%lf%lf",&a,&b);c=(b/a)*100;pr......
  • C 语言奇幻之旅 - 第09篇:C 语言指针
    目录引言1.指针的基本概念1.1指针的定义与初始化1.1.1指针的定义1.1.2指针的初始化1.1.3指针的解引用1.1.4示例代码1.1.5栈帧模拟1.2指针的运算1.2.1指针的加减运算1.2.2指针的比较运算1.2.3示例代码1.2.4栈帧模拟2.指针与数组2.1指针与数组的关系2.1.1......