4-转义字符,寄存器和cpu内存之间关系,数组大小,static用法,typedef-类型重定义,指针

发布于:2023-01-07 ⋅ 阅读:(651) ⋅ 点赞:(0)

1 建文件

 2    '\0'   0   '0'的区别

'\0'  是一个字符,转义字符,ASCII是0。

0   数字0,数值上和\0等价

’0‘  字符0 对应ASCII的值是48

3习题

1)

 EOF =end of file 文件结束标志 其值=-1

2)strlen见到\0才停止,如果见不到0则打印随机数。

#include<stdio.h>
int main() {
    char arr[] = { 'a','b','c','t'};
    printf("%d\n", strlen(arr));
    return 0;
}

strlen(arr)打印随机值

3)

 4)数组大小用常量指定,用n不可。

B

 B选项

 #include<stdio.h>
   int main() {
    int n = 10;
    int arr[n] = {0};
//n是变量,所以报错,在int n前面加const,也报错,因为n还是变量。

D选项

char ch[]="hello bit" 空格也算

数组一共存放10个字符\0实际存储了。(仅打印的时候不显示)字符串长度是不算\0,长度为9。

 

 

 

打印结果都是9

 总结:字符数组长度/0存储了算长度,字符长度不算\0,数到\0停止不包括\0。

5)含转义字符长度,看到strlen时\0t停止 打印结果7

 \t \121各算一个

4 写代码

1)求两个数的较大值

1.1固定数字的比大小

int num1 = 10;
	int num2 = 20;
	if (num1 > num2)
		printf("较大整数:%d\n", num1);//前面是"XXX:%d\n",s输出的值
	else
		printf("较大整数:%d\n",num2);

1.2手动随便输入比大小-scanf("%d%d",&num1,&num2);

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int num1 = 0;
	int num2 = 0;
	printf("请输入两个整数num1,num2:");
	scanf("%d%d", &num1, &num2);
	//可以直接赋值num1=10;num2=20;
	if (num1 > num2)
	{
		printf("较大整数:%d\n", num1);
		//前面是"XXX:%d\n",s输出的值;
	}
	else
	{
		printf("较大整数:%d\n", num2);
	}
	return 0;
}

!!!!!最好自己手动敲,复制代码报错看下面Notpad++(2)-eg,so easy!

      复制后的代码-----------------------> utfg-8下的代码---------------------转为ANSI编码(多?和空格)

                              (Notepad++软件新建文件-编码格式设置为utfg-8)   

最后将乱码去掉即可!删除干净哦!

参考文章::此文件中的某些Unicode字符未能保存在当前代码页中,是否以Unicode编码重新保存此文件..._ruoge2007的博客-CSDN博客_此文件中的某些unicode

(2)用函数体(求两个数的较大值)

 !!!!!不知道代码能不能直接用,不能的话(很简单!)就用Notpad++,后面有写,这个整半天原来是这样┭┮﹏┭┮。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int MAX(int x, int y)//带函数的
{

	if (x > y)
		return x;
	else
		return y;
}
int main() {
	int num1 = 0;
	int num2 = 0;
	printf("请输入两个(num1, num2)");
	scanf("%d%d", &num1, &num2);
	//可以手动赋值
   //int num1=20; int num2=30;
	int max = MAX(num1, num2);
	printf("最大整数%d\n", max);
	return 0;
}

 eg:Notpad++部分!举例我自己复制完是这样的!

 打开 notepad++, 新建空白文档,设置编码格式为 utf-8 编码,将代码粘贴, 再转为编码ansi

         utf-8下的代码                                             转为ansi

将乱码删除(注意空格!)再将代码复制即可。

方法参考:

此文件中的某些Unicode字符未能保存在当前代码页中,是否以Unicode编码重新保存此文件..._ruoge2007的博客-CSDN博客_此文件中的某些unicode

简单总结:最好自己打一遍哦。

求两个较大值步骤:

1 先写个函数MAX(  , );     找最大值,帮两个数

2  MAX(num1  ,num2 );  找谁(这两个数)的 (求出最大值通过返回值方式返回给MAX)

    MAX包括n1 n2,算较大值,将其结果值传给MAX(MAX=num1/num2)

3 max=MAX(num1  ,num2 ),用一个变量接受函数的返回值

4  print("%d\n",max)                     打印接收函数max在显示在%d这里

5 创建int MAX(int x,int y){

if (x>y)

return x;

else

return y;

}//谁大返回谁

5  size of对数组进行计算:

sizeof(a)等价sizeof a a是变量

size of是操作符,不是函数,因为sizeof的括号不能省略掉。

       int    arr[]={1,2,3,4,6} 数组可以不指定大小,通过初始化,通过赋值来确定数组大小

    int是数组元素类型,不是数组的类型,数组的类型是int[6]

size of对数组进行计算:

  int arr[] = { 0,1,2,3,4,5 };//6个元素,每个元素是整型,1个元素=4bit

  printf("%d\n", sizeof(arr))=4*6=24;//4  //计算数组大小。单位是字节

数组放在size of内size of(arry)

数组大小=数组元素个数*一个元素的大小

计算数组元素个数=数组大小/一个元素的大小=sizeof(arr)/sizeof(arr[0])

6   补码如何求源码

看源码的正负:看最高位,0为正数,1为负。

负数的补码:将源码-反码(最高位不变,其余取反),然后+1。

已知补码求源码:将补码-1,在反码(取反符号位不变其余取反)。

计算机的在数据存储时候存储的是二进制的补码方式进行存储打印的是源码

int main() {
    int a = 0;//4字节=32bit() a  0000 0000 0000 0000  ~二进制取反,~按位取反0/1转变
    int b = ~a;//b是有符号的整型  b  1111 1111 1111 1111  补码(最高位符号位为1代表负数)

 负数以补码的形式存储在计算机里)                         -1  求源码:补码-1然后取反 

 printf("%d\n", b);                            1111 1111 1111 1110         取反(符号位不变)                            return 0;                                     
  打印结果为-1                           1000 0000 0000 0001 (取反)使用的打印结果是源码  

                                                      -     ..........................1

总结:

        负数源码 ——(符号位不变,其余取反)—>反码+1= 补码

        补码(最高位为1时)-1 +取反(符号位不变)———>源码

7 操作符a++ a--/++a --a

    printf("a=%d b=%d\n", a,b);//打印两个结果用一个print的写

        后置++(后加),先使用a的值在++,b=10,a=a+1

                            前置++(先加),a=a+1=11,b=11

   int a = 10;
    int b = a++;//后置++,先用后+1    b=10 a=11
    int b = ++a;//前置++,先a自+1后用 a=a+1=11=b
    int b = a--;//后置--,先用后-1    b=10 a=9
    int b = --a;//前置--,先-1        a=a-1=9=b

总结:a++a--(后加减1)++a--a (先加减1)

8  类型的强制转换(类型)

       int a=3.14;(X)

      int a=(int)3.14;double->int

9 逻辑操作符&&(逻辑与),||(逻辑或)

  &&逻辑与只在乎两边的真假( 都真才真)

   0表示假,非0表示真。

&&举例(都真才真)

     

int a=0;假   int b=5;真 int c=a&&b=假=0;

|| 举例(有真则真) 

                                      真->1                         

 10 条件操作符(三目操作符)

   一共有三个操作数exp123

   exp1?exp2:exp3=(a > b? a : b)

 exp1是条件表达式,条件成立取a,不成立取b。

 

 

 

11关键字

1)auto int a = 10;

   //a是局部(自动)变量,a只可以在括号里面使用,括号外没有
    //自动创建自动销毁,也叫自动变量
    //auto省略掉了,本来局部变量都有一个auto,通常省略掉。

2)char字符类型   const常变量 enum枚举 extern引入外部符号 float单精度浮点数 long长整型

return返回short短整型 signed有符号的 static静态 struct结构体关键字  switch case

typedef类型定义 union联合(共用)体 void空 volatile体现C语言段位的

3)register:

原本从内存里拿数据—>cpu(早期内存访问速度和cpu处理速度比较搭配)后来cpu速度越来越快,内存访问速度跟不上Vcpu。所以有了高速缓存(用来解决内存和cpu速度不匹配问题的)和寄存器,所以从寄存器中拿数据到cpu,它的访问速度较快。

计算机进行一系列运算过程:

cpu去寄存器中拿数据,但寄存器里无数据,内存数据--加载到->高速缓存--加载到->寄存器,cpu可以拿数据啦!当CPU中没有拿到数据时在向下(高速缓存和内存中)访问,访问内存在依次向上传数据给寄存器,cpu在访问寄。

总结:cpu去寄存器中拿数据

        register  int a = 10;//a放在寄存器里面,a为寄存器变量。

仅仅建议a定义为寄存器变量(但寄存器有限,变量太多,最终a决定要不要放在寄存器中取决于编译器)

4)signed(有符号/有正负)/unsigned(无符号(位)/全正)
  (signed)  int  a = 10;           int是有符号的,int 定义的变量可负可正,signed可省略
    a = -2;
 
    unsigned int num = 0;   num无符号数没有正负之分,永远都是正的

                                           尽管放个负数,num也认为是正数

5)typedef-类型定义-类型重定义

 原本unsigned int num1 = 20;

typedef unsigned int u_int;//重命名,通过typedef, unsigned int=u_int

u_int num1=20;//在定义变量

6)static-修饰局部变量

    局部变量的作用域:

    void无返回值的函数,是空类型不用输出的数。

    

    过程:a是局部变量,进入作用域,a创建,a=2,函数出去,a出去,a销毁。i++。a出{}后a=2就不存在了,a=2只在{}内成立。

     局部变量a进入它的范围生命周期开始,而出了它的生命周期范围销毁,空间还给系统。栈自动·清除内存里的内容。局部变量的作用域和生命周期就是在{}(它们所定义的代码块内)。

   局部变量是进入它的作用域,生命开始。出函数范围,生命周期到了,局部变量销毁哦!空间还给系统。

①静态局部变量-static+局部变量(改变了局部变量的生命周期变长啦)

static修饰局部变量

  

 static修饰局部变量,局部变量生命周期变长。

     静态和全局变量一样,当某程序创建后,只会到这个程序完全退出才会销毁。

    静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。

     静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

局部变量    静态局部变量区别:

总结:    void test()                                              void test()

              {                                                              {

              int a=1; 局部变量                                    static int a=1;static+局部变量=静态局部变量

                 }                                                             }

                             局部变量                                                      静态局部变量

                  a是动态的,也就是auto类型               函数调用后不在回收。仅仅初始化一次。

                                                                          第一次被初始化后在调用函数时不在被初始化。

 生命周期               {}                                                              整个程序执行期。

    局部变量的值,用一次就销毁                    静态局部变量不会销毁,会一直保持到下一次引用。

    static在修饰变量的时候,static修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。

static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其他文件中访问,即使是外部声明也不可以 。

static修饰全局变量(全局变量的作用域只在static修饰的文件内使用)

extern用来声明外部符号的

外来的,外部的

 ​​​    static改变了全局变量的作用域,让静态的全局变量只能在源文件内部使用,出了源文件无法使用。

      不给除了静态的全局变量所在文件以外的文件用。static不能跨文件使用。
③static 修饰函数-改变了函数的链接属性。断了

     普通函数,具有外部链接属性,当static修饰函数时,断了(外部链接属性->内部链接属性)

     普通函数可以跨文件使用:

                               

                                               static修饰的函数(只能在本文件中使用) 

         可以说成是改变了函数作用域(类似全局变量)

        准确说法:普通函数,具有外部链接属性,当static修饰函数时,断了(外部链接属性->内部链接属性)

 

 7)define定义的常量和宏

#define定义标识符常量

#define MAX 100

main(){//MAX=100

int a=MAX;

return 0;

}

    

 12指针

地址个数:32^2

一个内存单元应该是多大?

 

一个空间(一个格子)假设一个比特:计算机为32位机器

2^32种编号,如果一个内存单元是一个比特位,访问2^32比特位空间,找计算器

 

 2进制转化10进制(DEC)

1byte字节=8bit   

4294967296(bit)/8=()byte/1024=()kb/1024=(512)mb/1024=0.5GB

最多访问0.5GB,给2/4GB用不完,不合适

0.5*8=4GB合适,所以一个空间一字节。

  一个地址存放1个比特位,但是这样内存就0.5g太小,所以应该是1个地址放存放1个字节就是8个比特位。

    第一种情况,假设一块是一比特,总内存就是0.5g.第二种情况,一块是一字节,也就是8比特位,总共内存4g。(32位计算机内存四GB是上限)

&取地址符,指针,指针大小

                                      打印的是16进制化成2进制

 

                            &a(a的地址)=p里面存的数

 

             *p=20       将a值改变

 总结:

 指针变量专门存放地址

  
     int a = 10;//&a取地址

    int*p= &a;//*p解引用操作符。p里内容为a的地址,p指向a
    *p = 20;//p里面存放地址对应的变量值改为20,*p,p改a内容

       指针是个变量,是用来存放地址的

 

 存地址用指针

指针变量大小:32位平台-4字节,64-8字节

 指针存的是地址-32/64个二进制位-32/64比特位的空间=4字节/8字节(指针变量大小)


网站公告

今日签到

点亮在社区的每一天
去签到