美文网首页
C编程知识

C编程知识

作者: 简洁心飞 | 来源:发表于2019-01-16 09:53 被阅读0次
C 指针、指针变量、函数指针、指针函数、指针数组、数组指针、
C 数组

一切皆数据、数据是一段内存地址、变量引用数据信息、指针引用地址信息

`函数名本质是函数指针、指向函数的内存地址、函数名就是函数的内存地址`
`数组名本质是数组指针、指向函数的内存地址、数组名就是数组的内存地址`

数据是什么?`数据就是一段内存地址`
指针是什么?`指针是一种特殊的数据类型、只能引用内存地址`
类型是什么?`数据类型用于分类数据、确定元素存储空间`
变量是什么?`变量不是特定类型数据的组成部分、用来引用数据`
指针变量是?`指针变量本质上就是存储特定数据的内存地址`、
普通指针变量引用其他数据的内存地址、
函数指针变量用于引用函数的内存地址、
数组指针变量用于引用数组的内存地址、函数的形参为数组时本质上就是一个数组指针。
函数也是数据、存储在内存中、具有物理内存地址、函数名就是一个指针变量、它指向函数的代码。

"函数指针" 是指向函数的指针变量、`本质是一个指针变量`、函数指针声明:`int(*p)();`  //注意括号 (*p)必须有
"指针函数" 指带指针的函数、本质还是一个函数、只不过返回类型是某一类型的指针.  `int *p ();`
当一个函数声明的返回值类型为一个指针类型时、实际上就是返回一个地址给调用函数、以用于需要指针或地址的表达式中。
代码块作用域、文件作用域、原型作用域
"全局变量":保存在内存的全局存储区中、占用静态的存储单元;全局变量在声明后整个程序中都是可用的。
"局部变量":保存在栈中、只有在所在函数被调用时才动态地为变量分配存储单元。局部变量在函数外部是不可知
在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉。
如果想将函数中此变量的值保存至下一次调用时,如何实现?static 关键字则可以很好的解决这个问题。
C/C++ 中static的作用
static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。
(1)static 修饰局部变量只执行一次初始化,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以
(3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。
(4)static修饰不想被释放的变量。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用 static 修饰。
(5)考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)。

静态变量都在全局数据区分配内存,包括静态全局变量、静态局部变量。
未经初始化的静态全局变量会被程序自动初始化为0。
静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的.
静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突
1)全局变量是不显式用 static 修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过 extern 全局变量名的声明,就可以使用全局变量。
2)全局静态变量是显式用 static 修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用 extern 声明也不能使用。
静态局部变量在全局数据区分配内存;
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为 0;
它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
一般程序把新产生的动态数据存放在堆区,函数内部的非静态局部变量存放在栈区。
非静态局部变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。
全局数据区的数据并不会因为函数的退出而释放空间。
C 存储类
存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。
这些说明符放置在它们所修饰的类型之前。
下面列出 C 程序中可用的存储类:auto、register、static、extern
auto 存储类是所有局部变量默认的存储类、auto 只能用在函数内,即 auto 只能修饰局部变量
register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)
寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 register 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。
static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
函数定义
  返回类型 函数名称(函数参数){函数主体}
  void main(){printf("%p\n", &d);}
函数声明
  返回类型 函数名称(函数参数);
  int max(int num1, int num2);
调用函数
  函数名称(函数实参);
  max(10,12);
函数参数
  普通参数、传递的值、传递数据的拷贝
  指针参数、传递引用、传递数据的地址
C 数组
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。
数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组中的元素可以通过索引访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
声明数组
  数据类型 数组名称[元素的数量];
  double balance[5];
初始化数组
  int student[5]={1,2,3,4,5};
C 多维数组
  type name[size1][size2]...[sizeN];
  double threedim[5][10][5];
C 传递数组给函数
函数的数组形参其实是一个数组指针、传递的是地址
方式1:形式参数是一个指针
  void myFunction(int *param);
方式2:形式参数是一个已定义大小的数组
  void myFunction(int param[10]);
方式3:形式参数是一个未定义大小的数组:
  void myFunction(int param[]);
C enum(枚举)
枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。
枚举语法定义格式为:
enum 枚举名 {枚举元素1,枚举元素2,……};
在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的

相关文章

网友评论

      本文标题:C编程知识

      本文链接:https://www.haomeiwen.com/subject/bmppdqtx.html