当前位置: 代码迷 >> 综合 >> C和指针(The pointer on C)(Ch1~Ch5)
  详细解决方案

C和指针(The pointer on C)(Ch1~Ch5)

热度:73   发布时间:2023-11-07 07:34:19.0

前言

   没有需求就没有供给,谨以此促进我学习的效率,偏向于考研。

   本文提取的内容(个人观点),适合有稍微的C基础(谭浩强入门的基础语句总不用说)的读者,把玩一二,以博笑耳。

Ch1 快速上手

   预指令:宏定义,   #define  MAX_SIZE 20

   C语言中不存在字符串类型的数据,但是在该语言中,存在一项约定:字符串就是以NUL(\0)字节结尾的字符,包括空字符串“”也含有NUL,其(NUL)本身不被看作是字符串的一部分。   其中,我们称用双引号括起来的内容——字符串常量,也是验证了C语言中字符串的定义:char a[5] = "Hello"——在内存中占用了六个内存空间(‘H’,‘e’,‘l’,‘l’,‘o’,‘NUL’)。

   printf格式代码:%d(十进制),%o(八进制),%x(十六进制),%g(打印一个浮点值),%c(打印一个字符),%s(字符串)。

   在函数的声明中,参数可以不用规定数组的长度。

void test(char a[]){}

   puts、gets函数——针对字符串。它把字符串写到标准输入输出并在末尾添上一个换行符。

   数组返回的值实际上是数组空间的首地址,在逻辑上(内存)其存储空间是连续相邻的,实际上的MAC(物理地址)是乱序、随机的。以此a指向的数组地址和Num是相同的。

int Num [2] = {1,2};
int* a = Num;

   同理的例子有:strcpy(char a[],char b[])函数中的俩个参数分别为目标字符串和源字符串的源地址。

   Ch2 基本概念

   不良的风格和不良的文档是软件生产和维护代价高昂的俩个主要原因。 ps:但是:问题具有俩面性,①技术角度的确是这样的②商业角度来说,不宜太规范,这样利于二次接单。

   ROM:只读存储内存(Read only Memory),通过只读取内存中存在的数来达到——出事前(如断电),保护数据。因为只读(在运行内存中),没有进行编辑(修改)操作,故不会产生数据丢失,通常用于硬盘

   RAM:随机存储内存(Random access Memory),出事前(如断电),无法保护存储内容,因为在编辑操作,将丢失其存储内容(适用于短时间存储),常用于(运行)内存

   CH3数据

   C语言中,仅有四种基本数据类型——整形、浮点型、指针和聚合类型(如数组和结构等);

   整形有:字符、短整型、整形和长整形,分为有符号和无符号俩种版本。他们(适用于其它)之间的大小规则:   长整形至少应该和整形一样长,而整形至少应该和短整形一样长。

   八进制的表示:只要在数值前面以0开头;    十六进制则是以0x开头。

   枚举类型:Java中的枚举类型更像是存储数据的类(实际上它的确是继承了java中的一个实现的),而C语言不同于JAVA、C++中的枚举类型是基础数据类型,枚举类型在C语言中是构造数据类型。

   指针数据类型的声明:int* i;更容易理解为一个指向整形数据的指针,但是这并不是一个好的技巧(我就觉得很好),因为int a,b,c;是错误的,应当:int *a,*b,*c;

   隐式声明:如果声明缺少类型名如:a;编译器回假定它为整形:即,int a;

   自定义类型机制(typedef):如:typedef char* test;那么test a; 就是声明a为一个指向字符空间的指针,类型的是声明结构体的时候。感觉没什么用就是了。

   const修饰变量,使得该变量不可改变(修改),const和全局变量没有必然的联系是否为全局变量决定于变量出现的位置。

   代码作用块的覆盖问题:参照CSS的优先级——内部覆盖外部(双方都是局部变量),如果是有行参,那么局部隐形参。

PS:俩个非嵌套的代码块最多只有一个处于活动状态。

   链接属性:决定如何处理出现在不同文件中出现的相同的标识符,链接属性一共有三种——external、internal、none。static关键词对于缺省的external声明(未定义),会将其定义为internal,将它变为该源文件中所私有的变量。

   存储类型:①普通内存;②运行时的堆栈;③硬件寄存器;

   静态变量:在程序运行前创建,贯穿程序,属于静态内存区——凡是声明在代码块外面的都不放在堆栈内存中,放在静态内存中。

   代码块内部声明的变量都放在堆栈内存中。函数的形式参数不能声明为静态,因为实参总是在堆栈中传递给函数,用于递归。

   register关键词可以让变量存储在硬件存储器,不过要看编译器理不理睬。

Ch4语句

   goto语句,正确的用法是用于跳出多重内嵌循环——原因是,break只能跳出一个循环。当然,不得以可以用return离开。

/*goto*/int i=0;while(1){while(1){while(1){i++;printf("The num of i is: %d\n",i);if(i>=66){goto o;}}}}o:printf("The circulation has broken.");return 0;

Ch5操作符和表达式

   移位操作符:单独列出来作为一篇文章把(反正别人的我没看懂)herf="?????";

   赋值:如a=x=y + 3,从左至右运算,但是不可以说a和x赋予同样的值,因为溢出,加入x是字符变量,那将会溢出。

   类似于!、~、++、--、+、-、&、*、sizeof单目运算符只接受一个操作数的操作符,比如:sizeof(a=b+1)并没有向a赋值。

   类似于a=6,c=++a和d=a++,前缀操作符在进行复制之前增加变量的值,后缀操作符在进行复制之后才增加变量的值。c=7,d=6。

   由于!操作符优先级很高,所以表达式内包含了其他操作符,你最好把表达式放在一对括号里。

   逻辑操作符(&&)用于测试零值和非零值,而位操作符(&)用于比较他们的操作数中对应的位。

   逗号表达式:整个逗号表达式的值就是最后那个表达式的值。如:while(a=b,b++,a>0){}等价于:

a=b;
b++;
while(a>0){
a=b;
b++;
}

   关于数组arry——arry[下标]==*( arry + (下标)),折旧很好的解释了:arry返回的是数组的首地址了。

   左值和右值:in brief ,左值就是需要修改的地点如:a = b+1;中的a。右值就是需要修改的值,如b+1它指定的是一个值。但是b+1=a是非法的,从编译原理的角度来思考;

   溢出:数据类型存储的大小超过需要存储的大小。

  相关解决方案