C-const和static的区别, 指针作为函数的返回值, 指向函数的指针, 枚举

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C-const和static的区别, 指针作为函数的返回值, 指向函数的指针, 枚举相关的知识,希望对你有一定的参考价值。

const和static的区别
const ——只读, 只在声明中使用
1 const int num = 10;
2 int const num = 10;
num变量只读, 不能修改
 
1 const int arr[4] = {10, 20, 30, 40 };
2 int const arr[4] = {10, 20, 30 ,40 };
数组的元素的值不能被修改, 只读
 
1 const int *p1 = #
2 int const *p1 = #
无法通过p1指针去修改指针指向的变量的值, 但是如果直接操作变量是可以的, 但是指针变量的值可以改, 即可以把另外一个变量的地址赋值给这个指针
 
 
1. 指针作为函数的返回值
函数声明:
int *test(){
}
指针可以作为函数的返回值, 但是不能返回局部变量的地址
即: 要保证返回的指针指向的变量在函数结束以后, 其存在的空间依然存在
解决办法:
在函数内部在堆区申请空间,  返回的申请的空间的地址
但是要记住在使用完毕以后及时free
正确的示范:
 1 int *test(){
 2     int arr = calloc(3, sizeof(int));
 3     *arr = 10;
 4     *(arr+1) = 10;
 5     *(arr+2) = 20;
 6     return arr;
 7     //这时候相当于在堆区申请了3个int型空间, 然后作为数组存储了{10, 20, 30};
 8     //返回的是数组arr在堆区的首地址
 9     //在函数结束以后, 遇到free以前, 其他调用者依然能够得到arr的地址
10 }

 

 
 
注意:
1. 函数的返回值可以是: 局部变量的值, 但是不是局部变量的地址
 
2. 如果返回值是char类型的,  char *函数名
例:
1 char *getWeekday(int day){
2     switch(day){
3         case 1:
4         return “Monday”;
5         break;
6         //这时候, 返回的是一个字符串, 字符串是直接存在常量区的, 所以不需要另外申请堆区空间的
7     }
8 }    
不需要申请另外堆区空间的解释: 申请在常量区的空间, 是不会被回收的, 直到程序接收以后才会被回收
 
以字符指针存储在常量区的字符串数据不能改, 见~User/Desktop/老师那来的/day12笔记/01-指针与字符串 5
 
 
 
2. 指向函数的指针
1. 程序运行时, 会被加载到内存
2. 程序中有代码——以及代码组成的函数
3. 所以函数也肯定是存在内存中的某一区域——代码段
4. 既然是存储在内存中, 那么肯定要用1块相应的内存空间来存储——那么就会有对应的地址
5. 那么就可以使用一个指针来存储这个函数的地址, 即指向这个函数
6. 然后利用指针来调用这个函数
7. why? 这样调用函数就有了两种方式了
 
8. 指向函数的指针的声明:
1. 并不是任意的函数函数都可以指向, 要求指向的函数的返回值类型和参数秒数. 必须要与指针的秒数一样
2. 声明语法
返回值类型 (*指针名)([对应函数参数列表]) 例:
void (*pFunction)();
指向一个没有返回值没有参数的名叫的函数
                               
  
 
枚举
1. 引入: 有时候 有些变量只能够取某几个限定值,  这时候普通变量无法满足需求
     C语言中也没有提供可以限定取值类型的变量.
     需要我们自己定义具备限定取值的类型
     ——枚举
 
2.作用: 支持创建一种新的数据类型, 这个类型的变量的取值被限定
 
3.语法格式
  1. 初始化
     enum 新类型名称 {
          限定取值1, 限定取值2, …
     };
    例:          
1 enum Direction{
2     East, South, West, North
3 }; 
  1. 声明变量
     enum Direction dir; // 这样, 变量 dir 就只能取 E, S, W, N 四个值中的一个了
  1. 变量初始化
     dir = East;
 
4.注意事项
  1. 作用域: 每一个枚举都只能在相应的函数体内部起作用, 如果想要么就定义成全局
 
5.一些规范
  1. 枚举类型的名称命名规范: 首字母大写, 每一个单词的首字母大写
  2. 枚举值的命名规范: 
 
typedef  别名
给东西取别名
  1. 用例: 给结构体名瘦身
    1.  先声明结构体类型, 然后使用typedef来为结构体类型取别名
    2. 声明结构体烈性的同时, 就使用typedef来为结构体类型取一个别名
    3. 为一个匿名结构体(声明匿名结构体的同时)就使用typedef来为结构体类型去一个短别名——最常用的
  2. 给枚举类型瘦身
    1. 先声明, 再别名
    2. 声明同时取别名
    3. 匿名取别名 

以上是关于C-const和static的区别, 指针作为函数的返回值, 指向函数的指针, 枚举的主要内容,如果未能解决你的问题,请参考以下文章

C++面向对象-static、const

将线程函数声明为静态函数的问题

C++面试题合集

C++面试题合集

C++面试题合集

传指针和传指针引用的区别/指针和引用的区别(本质)