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.语法格式
- 初始化
enum 新类型名称 {
限定取值1, 限定取值2, …
};
例:
1 enum Direction{ 2 East, South, West, North 3 };
- 声明变量
enum Direction dir; // 这样, 变量 dir 就只能取 E, S, W, N 四个值中的一个了
- 变量初始化
dir = East;
4.注意事项
- 作用域: 每一个枚举都只能在相应的函数体内部起作用, 如果想要么就定义成全局
5.一些规范
- 枚举类型的名称命名规范: 首字母大写, 每一个单词的首字母大写
- 枚举值的命名规范:
typedef 别名
给东西取别名
- 用例: 给结构体名瘦身
- 先声明结构体类型, 然后使用typedef来为结构体类型取别名
- 声明结构体烈性的同时, 就使用typedef来为结构体类型取一个别名
- 为一个匿名结构体(声明匿名结构体的同时)就使用typedef来为结构体类型去一个短别名——最常用的
- 给枚举类型瘦身
- 先声明, 再别名
- 声明同时取别名
- 匿名取别名
以上是关于C-const和static的区别, 指针作为函数的返回值, 指向函数的指针, 枚举的主要内容,如果未能解决你的问题,请参考以下文章