2022/1/19

数据类型:

 char:只占一个字节,取值范围为 -128 ~ +127(-2^7~2^7-1)

cpu字长是指cpu同时参与运算的二进制位数,现在主流的pc的机器字长都是64位的。机器字长直接决定着机器可寻址的虚拟空间地址大小。

指针变量8个字节

数组:对数组的操作时对元素的操作,不允许对整体操作。

变量是内存空间的映射

直接寻址是一种基本的寻址方法,其特点是:在指令格式的地址的字段中直接指出操作数在内存的地址。由于操作数的地址直接给出而不需要经过某种变换,所以称这种寻址方式为直接寻址方式。在指令中直接给出参与运算的操作数及运算结果所存放的主存地址,即在指令中直接给出有效地址。 

间接寻址是相对于直接寻址而言的,指令地址字段的形式地址D不是操作数的真正地址,而是操作数地址的指示器,或者说是D单元的内容才是操作数的有效地址


两值相比较不能比是否相等,应该比较精度:如代码中不应该直接比较1.0/3*3是否等于1.0,而是应该比较两式的精度,用两式先减,判断是否‘相等’

原码:将十进制数转化为二进制,然后正数首位取“0”,负数取‘1’;

反码:首位(符号位)不变,其余位取反;

补码:反码的基础上在末尾加1;


strlen:strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

 sizeof() 是一个判断数据类型或者表达式长度的运算符。
 

#include<stdio.h>
int main( )
{
    char a[1000];
    int i;
    for(i=0;i<1000;i++)
    {
            a[i]=-1-i;
    }
    printf("%d\n",strlen(a));
    
    return 0;
}

输出的结果时255;

原因如下:strlen是计数器的工作,当他遇到第一个‘\0’的时候就会停止。由于数组a是由char定义的,所以数组的值只能在-128至127之间。当i从0循环至127的时候,a=-128;然后再执行循环语句,由于取值范围的约束(可以通过上面笔记的原码,反码,补码来判断)a再减1就会变成127。再执行循环至a[254]=1;a[255]=0,strlen在此处停下统计长度为255;

转义字符(Escape character):所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。 

如x41   41是16进制,十进制数则为65

浮点数:是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法

浮点数可以用尾数加指数来表示:在这种表示方法中,一部分表示尾数(小数),一部分表示指数。

 如3.14159可表示成

 即:

符号扩展:当用更多的内存存储某一个有符号数时,由于符号位位于该数的第一位,扩展之后,符号位仍然需要位于第一位,所以,当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展是一样的,因为符号位就是0. 
比如一个用一个8位二进制表示-1,则是10000001 
如果把这个书用16位二进制表示时,则为11111111 10000001 高位全都是1,这个叫做符号扩展,主要用于对其操作数。 

零扩展就是全补零。不论其符号位是多少,高8位全都补0.

短的数型放在长的数型里面都按照符号位扩展

汉字编码两个字节,最高位都是1:为了区别汉字与普通ASCII字符,国标汉字内码只能叠加到特殊ASCII字符所用的空间上。这是为了最大限度保障兼容性。
最高位必须为1,因此内码的区、位部分必须大于0x80。实际上还有一部分0x80~0x9F保留的,汉字内码计算时实际为区/位码+0xA0。


内存空间分配给变量,不分配给数据类型!int a;分配给了a,而不是给了int

void * 万用指针  万用=无用

 运算符的优先级:所有的单步运算符优先级高于双步运算符。算术运算符优先级高于关系运算符。逻辑非  (!)是单步运算符优先级高于逻辑与 , 逻辑或。"逗号运算符"优先级最低

 int i;是定义,而extern int  i;是声明

C语言变量的定义和声明的不同之处:

1、变量在使用前就要被定义或者声明;

2、在一个程序中,变量只能定义一次,却可以声明多次;

3、定义分配存储空间,而声明不会

详细解释:链接声明和定义的区别_const-CSDN博客_声明和定义的区别 声明和定义的区别:在我上课的书中并没有说明两者的区别,书上写着“在本书中,声明和定义有着相同的含义”,当时学的时候也没注意到这点,后来看到一些面试题,才注意到这些坑。      一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。   另一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。  声明是向编译...https://blog.csdn.net/cheng__lu/article/details/86226054

野指针:指针指向了一块随机的空间,不受程序控制。

野指针产生的原因:
1.指针定义时未被初始化:指针在被定义的时候,如果程序不对其进行初始化的话,它会随机指向一个区域,因为任意指针变量(出了static修饰的指针)它的默认值都是随机的
2.指针被释放时没有置空:我们在用malloc()开辟空间的时候,要检查返回值是否为空,如果为空,则开辟失败;如果不为空,则指针指向的是开辟的内存空间的首地址。指针指向的内存空间在用free()和delete释放后,如果程序员没有对其进行置空或者其他赋值操作的话,就会成为一个野指针
3.指针操作超越变量作用域:不要返回指向栈内存的指针或者引用,因为栈内存在函数结束的时候会被释放。
详请见:CSDN博主「胡思先生」的原创文章.

链接:https://blog.csdn.net/l477918269/article/details/89949858

野指针的危害:

问题:指针指向的内容已经无效了,而指针没有被置空,解引用一个非空的无效指针是一个未被定义的行为,也就是说不一定导致错误,野指针被定位到是哪里出现问题,在哪里指针就失效了,不好查找错误的原因。

避免野指针:没有指向时直接赋值NULL

void f(int c)
{     int a=0; 
    static int b=0;
    a++; 
    b++;
    printf("%d: a= %d, b= %d\n",c, a, b);
}
void main( )
{     int i;
        for(i=1;i<=3; i++)
        f(i );
}

 输出为:1: a=1,b=1

               2: a=1,  b=2

                3; a=1, b=3

分析:主函数一共三次循环,传入f()分别为f(1),f(2),f(3);而函数每次输出的时候由于a全为0,所以每次输出的a都是1.b被定义为一个静态局部变量,它会继承之前的值,所以导致b会累计前面的数值,则输出b分别是1,2,3;

今日例题:

#include<stdio.h>
int main()
{
    int i,j;
    printf("    |");
    for (i = 1; i <= 9; i++)
    {
        printf("%4d",i);
    }
    printf("\n");
    for ( i = 1; i <=10; i++)
    {
        printf("----");
        
    }
    printf("\n");
    for ( i = 1; i <10; i++)
    {
       
        printf(" %3d|",i);
       for ( j = 1; j < i; j++)
       {
           printf("    ");
           
       }
       for ( ; j <10; j++)
       {
           printf("%4d",i*j);
       }
        printf("\n");
    }
    
}

输出九九乘法表:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值