C语言基础知识三

1、isspace函数

  函数说明:检查参数c是否为空格字符,也就是判断是否为空格(' ')、水平定位字符('\t')、归位键('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')的情况。

  返回值:若参数c为空格字符,则返回TRUE,否则返回NULL(0)

 例子:

1     int i;
2     char str[]="123c@#FD\tsP[e?\n";
3     for(i=0;str[i]!=0;i++)
4     {
5     if(isspace(str[i]))
6         printf("str[%d]is a white-space character:%d\n",i,str[i]);
7     }

结果:

  str[8] is a white-space character:9 /* \t */
  str[14] is a white-space character:10 /* \n */
2、原码、补码和反码的知识总结
计算机存储数据信息都是以二进制编码存储的,机器内存储的数据的表达形式称为“机器数”,而它代表的数制称为这个机器数的“真值”。数有正负之分,那么在计算机里怎么表示正负呢?

就是用“0”表示正号,“1”表示负号,符号位放在数的最高位。例如,二进制数X=(+1010100),Y=(-1010100),则他们在机器中就存为

         X:

01010100

 

         Y:

 

11010100

 

        最左边那一位是符号位,跟它后面的数字一起组成一个数。

原码:最高位为符号位,后面是绝对值来表示一个数,这种编码叫做“原码”,但是对于0而编码方式有两种,+0就是000...0,-0就是1000...0;但是这种编码方式对于四则运算,同号运算,异号运算的如何处理很麻烦。

反码:正数的反码跟原码一样,负数的反码的符号位跟原码一样,但其余各位取反,也就是0变1,1变0。例如,二进制数+1100111的原码是01100111,反码也是01100111,-1100111的原码是11100111,反码则是10011000

补码:正数的原码、反码和补码是一模一样的。 负数的补码是其反码的最末位加1得到的,我们经常顺口记为负数的补码就是取反加1。

 必须要指出的是补码运算的结果也是补码,还要把它算到原码才得到最后结果。那么知道补码怎么计算原码,很简单,就是对补码再求补码就是源码了。

例子:

10-67 = ?,10的原码是00001010,补码跟原码一样,-67的原码是11000011,补码是10111101。两个补码相加是11000111,这是结果的补码,求原码要对这个补码再求补码,取反加1后就是10111001

3、基本数据结构:

因为char型本质上就是整型,只不过是一个字节的整数,用来存放字符的ASCII码。

  short修饰int时,short int表示短整型,占2个字节,这里int可以省略,也就是说short就是short int。long可以修饰int和double,long int表示长整型,占4个字节,同样int也可以省略。int在不同的编译环境中可能占的字节数不一样,大多数环境中占用4个字节。short类型固定占2个字节,long类型固定占4个字节。

  signed和unsigned可以用来修饰char型、int型、short型和long型。signed表示有符号数,unsigned表示无符号数。有符号数以二进制补码形式存储,最高位为符号位,“0”表示正,“1”表示负。无符号整数只能是正数。char型、int型、short型和long型默认情况也就是不加修饰的情况下是有符号(signed)的。

4、位运算:

  (1)按位与(&)。它是对两个操作数的二进制形式的每一位分别进行逻辑与操作。比如3的二进制形式为00000011,5的二进制形式为00000101,按位与后结果是00000001。

      (2)按位或(|)。它对两个操作数的二进制形式的每一位分别进行逻辑或操作。还是比如3和5按位或运算后结果是00000111。

      (3)按位异或(^)。它对两个操作数的每一位进行异或,也就是如果对应位相同则运算结果为0,若对应位不同则计算结果为1。例如3和5按位异或后结果为00000110。

      (4)按位取反(~)。这是一个一元运算符。它对一个二进制数的每一位求反。比如,3按位取反就是11111100。

      (5)移位。包括左移运算(<<)和右移运算(>>),都是二元运算符。移位运算符左边的数是需要移位的数值,右边的数是移动的位数。左移是按指定的位数将一个数的二进制值向左移位,左移后,低位补0,移出的高位舍弃。右移是按照指定的位数将一个数的二进制值向右移位,右移后,移出的低位舍弃,如果是无符号数则高位补0,如果是有符号数,则高位补符号位或0,一般补符号位。比如,char型变量的值是-8,则它在内存中的二进制补码值是11111000,所以a>>2则需要将最右边两个0移出,最左边补两个1,因为符号位是1,则结果为11111110,对其再求补码就得到最终结果-2

5、联合体:

 联合体也可以没有名称,叫做无名联合体。无名联合体只是声明一个成员项的集合,这些成员有相同的内存地址,可以用成员项的名字直接访问。鸡啄米给大家一个无名联合体例子:

       union
       {   
                int      i;
                float   f;
       }

       在程序总可以直接用成员项i和f的名字访问i和f,比如 i=2; f=3.2;。无名联合体一般是用作结构体的内嵌成员。鸡啄米给写一个使用联合体的例子:

       #include <iostream>
       using namespace std;

       union myun
       {

                int   k;
                struct { int x; int y; int z; }u;
       }a;
       int _tmain(int argc, _TCHAR* argv[])
       {
               a.u.x =4;
               a.u.y =5;
               a.u.z =6;
               a.k = 0;
               cout<<a.u.x<<" "<<a.u.y<<" "<<a.u.z<<" ";
               return 0;
       }

      这个程序输出0 5 6。为什么呢?不应该是4,5,6吗?因为联合体的成员共用内存,所以a.u.x占用的内存里的4被后来的a.k覆盖了,变成了0

6、类型自定义:

使用的语法形式是:typedef   已有类型名  新类型名表;。新类型名表中可以有多个标识符,它们之间用逗号分开,就是在一个typedef语句中可以为一个已有数据类型声明多个别名,比如,

       typedef  double  length,width;  //注意这种多种类型的
       length  a;
       width   b;

 如果要定义指针类型的:

  typedef double length,*width;

相当于 width a;等价于double* a;

7、引用:

声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象;一旦一个引用被初始化后,就不能改为指向其它对象。简单说就是引用定义的时候就指定它指向的变量,之后就不能变了;

1 int  i, j; 
2 int &ri=i;    // 建立一个int型的引用ri,并将其初始化为变量i的一个别名
3 j=10;
4 ri=j;          // 相当于 i=j;很好奇这句话的可行性

8、带默认参数函数调用:

默认参数值必须按照从右向左的顺序定义。在有默认值的形参右面,不能出现无默认值的形参。也就是说应该把有默认值的形参都一块放到右边,不能让有默认值的跟没默认值的形参穿插着放。因为在调用时,实参初始化形参是按从左向右的顺序。例如:

  int add(int x,int y=5,int z=6);   //正确
       int add(int x=1,int y=5,int z);   //错误
       int add(int x=1,int y,int z=6);   //错误

9、模板函数:

  Template <typename 标识符>

eg:

  Template<typename T>;

  T abs(T a)   //求绝对值

  {

     return a>=0? a:-a;

  }

10、对象数组:

当数组的元素是某个类的对象时此数组就是对象数组。声明一维对象数组的形式为:类名 数组名[下标表达式];。跟前面说过的基本数据类型的数组一样,使用对象数组也只能引用单个的数组元素,而每个数组元素都是对象,利用这个对象又可以引用它的公有成员,引用形式为:数组名[下标].成员名。

对象数组在初始化时每个对象元素都会调用其构造函数。如果初始化时数组元素显式给出初始值就会调用带形参的构造函数,如果没有显式指定初始值则调用默认构造函数。例如,A b[2] = { A(2,3) };会先调用带形参的构造函数初始化b[0],再调用默认构造函数初始化b[1]。

10、数组内的数据访问:

假设有一个声明:int a[10];,声明了一个一维整型数组,有10个元素。数组名a代表了数组a的首地址,它是一个指针常量,也就是不能改变,所以,注意,不能进行自增自减运算(不能够用a++或者++a来进行移动下标,从而获取数据,但是这种形式是可以的:int* p=a; p++或++p来进行移动,a为常量,不能自增自减运算)。首地址就是数组第一个元素的地址,所以a和&a[0]是完全等价的。a中的10个元素是连续存放在内存中的,所以用数组名结合简单的算术运算就可以访问数组的元素。a是数组第一个元素的地址,那么第i+1个元素也就是下标为i的元素的地址就是a+i,第i+1个元素就是*(a+i)。例如,*a就是a[0],*(a+7)就是a[7]。

 

转载于:https://www.cnblogs.com/gzy-zju-edu/articles/4156591.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值