[黑马程序员]10[C语言]C语言基本语法与基本语句部分需要注意的几个知识点

本文详细介绍了C语言中函数、位运算符和内存管理的概念及应用,包括函数定义、位运算符操作、内存分配与释放等核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------- android培训java培训IOS培训、期待与您交流! ----------

 

1.    函数

 

//函数的好处:把复杂的代码封装到一个函数块里去,可以精简化代码

//什么情况下定义函数:添加一个常用的新功能

//函数的定义格式:

//返回值类型函数名(形式参数列表)

//{

//    函数体

//}

 

//定义一个函数:1.起一个有意义的函数名

 

//#include <stdio.h>

//

//int printLine()

//{

//    printf("*********\n");

//    return 0;

//}

//

//int average(int num1,intnum2)

//{

//    return (num1 +num2)/2;//return的作用:1.函数结束2.给函数返回一个返回值

//}

//

//int main()

//{

////    printLine();

////    printLine();

//    int a =10;

//    int b =9;

//    int addition = a+b;

//    int subtraction = a-b;

//    int multiplication = a*b;

//    int division = a/b;

//    int c = average(a, b);//函数封装好后需要执行函数的功能,这个时候直接调用函数就行了,不用管内部具体实现

//    //int c = (a +b)/2

//    //这些运算功能都可以封装到函数里去

//    return 0;

//}

 

 

//#include <stdio.h>

////形式参数:定义函数时函数名后面的参数,形参

////实际参数:调用函数时传入的具体数据,实参

////实参个数必须等于形参个数

////函数体内部不能定义和形参一样的变量

////实参对形参纯粹是值传递,没有干涉关系,改变形参不会影响实参的值

 

2.    位运算

 

//位运算符有下面几类:

//1.按位与(&)

//2.按位或(|)

//3.按位异或(^)发音hat

//4.左移运算符(<<)

//5.右移运算符(>>)

//6.按位取反(~)发音tilde

 

//1.按位与(&)

//1则为1,其余都为0

 

//2.按位或

//特殊下像加法

 

//3.按位异或(^)

//相同为0,相异为1

//特殊下像减法

 

int anWeiYu(int n1,int n2);

 

int anWeiHuo(int n1,int n2);

 

int anWeiYiHuo(int n1,int n2);

 

int anWeiQuFan(int n1,int n2);

 

int main()

{

    int n1,n2;

    int c1,c2,c3,c4;

   

    printf("输入n1,n2:\n");

   

    scanf("%d,%d",&n1,&n2);

   

    c1 = anWeiYu(n1, n2);

   

    c2 = anWeiHuo(n1, n2);

   

    c3 = anWeiYiHuo(n1, n2);

   

    c4 = anWeiQuFan(n1, n2);

   

    printf("按位与的结果为:%d\n",c1);

   

    printf("按位或的结果为:%d\n",c2);

   

    printf("按位异或的结果为:%d\n",c3);

   

    printf("按位取反的结果为:%d\n",c4);

   

    return0;

}

 

int anWeiYu(int n1,int n2)

{

    return n1 &n2;

}

//可以利用按位与获得某一个数字的某一个二进制位的值

//应用:可以获得最左边二进制位的数字

 

int anWeiHuo(int n1,int n2)

{

    return n1 | n2;

}

 

int anWeiYiHuo(int n1,int n2)

{

    return n1 ^ n2;

}

 

int anWeiQuFan(int n1,int n2)

{

    return ~n1;

}

 

//两个参数值的互换

//1.额外参数temp

//2.加减法(乘除也行)

//3.异或(或和异或也行)

//4.JavaC#中有:num1 =num2 + (num2 =num1)*0;这里也行

 

//凡是互为逆运算的都可以实现两个参数值的互换

 

//左移运算符:将数字的二进制格式的数字往左边移动一个二进制位,右边不够的补0

 

//右移运算符:将数字的二进制格式的数字往右边移动一个二进制位,左边不够的补符号位

 

//int main()

//{

//    //printf("%d\n",1<<2);

//

//    for (int i =0; i <8; i++) {

//        printf("%d\n",256>>i);

//    }

//

//    return 0;

//}

 

//常见的应用

//1.计算2的整数倍的幂(代码不好阅读,砍掉)

//2.做标志枚举

//1表示东,2表示南,4表示西,8表示北(仅占一个数据位) |1001标志枚举

//3.计算一个数字的2进制格式

//1做按位与,右移, 继续按位与, 右移,从而读取2进制格式

//先移31,1按位与,然后30,1按位与,一直读完,从而读取2进制顺位

 

 

//获取一个数字的二进制格式

 

void transferBinary(int n,int length);

 

int calCount(int n);

 

int main()

{

    int n;

   

    printf("输入数字\n");

   

    scanf("%d",&n);

   

    int length =calCount(n);

   

    printf("这个数的二进制格式为:\n");

   

    transferBinary(n,length);

   

    return0;

}

 

int calCount(int n)

{

    int count =0;

    while (n !=0) {

        n =n>>1;

        count++;

    }

    return count;

}

 

void transferBinary(int n,int length)

{

    //printf("这个数的二进制格式为:\n");

    for (int i =length -1; i >=0; i--) {

        //        int temp = n&1;

        //        printf("%d",temp);

        //        n >>=1;

        printf("%d",(n>>i)&1);

        if (i%4==0) {

            printf(" ");

        }

    }

    printf("\n");

}

 

3.    内存管理

 

//程序运行,一定要有内存

//每隔函数在运行的时候,操作系统都会为其维护一个内存

//每一个函数运行时分配的内存,成为栈内存(线程栈,堆栈)

//1>

//2>数据储存是从高地址向低地址进行分配

//3>数据的内存是连续分配

//4>运行函数的时候,内存会分配,函数运行结束后,内存回收

 

// 1.什么是内存管理

 

// 所谓的内存管理,就是维护内存的分配,使用和销毁.实际开发过程中,声明的局部变量,全局变量都不需要考虑内存管理的问题

 

// 1>对于全局变量(static变量,extern变量)从程序加载到内存开始初始化,直到程序结束才会释放

 

// 2>对于局部变量(在函数里定义的变量,除了staticregester修饰的变量)函数执行开始分配内存,函数运行结束回收内存

 

// 除非程序员编写了申请内存的代码,那么这个内存就需要手动的维护管理

 

// 2,为什么要使用动态分配的内存?使程序具有更强大的适应能力在使用字符指针的时候,无法实现输入int *str[256];内存大小固定

 

// 3.有哪些函数需要考虑内存管理呢?

// malloc   void *malloc(size_t);指针malloc(字节数);

// calloc  指针 calloc(单位字节大小,数量);  calloc(4,10);

// realloc 指针 realloc(大小,指针);

//free(指针)相当于dealloc

 

 

 

4.    static

 

//static,extern

//1>函数

//2>变量

 

//函数的类型

//外部函数:定义的函数能被本文件和其他文件访问,

//1>默认情况下所有函数都是外部函数

//2>整个项目的函数不允许重名

 

//内部函数:定义的函数只能被本文件访问,其他文件不能访问

//1>允许不同文件中又同名的内部函数

//2>不可省略

 

int main()

{

    test();

   

    test2();

   

    return0;

}

 

//extern完整地定义一个外部函数,extern完整地声明一个外部函数

//extern可省略

 

externvoid test()

{

    printf("88\n");

}

 

//static定义一个外部函数,static声明一个外部函数

//static不可省略

staticvoid test2()

{

    printf("22\n");

}

 

 

//全局变量分两种:

//外部变量:定义的变量能被本文件和其他文件访问

//1>默认情况下,所有的全局变量都是外部变量

//2>不同文件中得同名外部变量,都代表一个变量

 

//内部变量:定义的变量只能被本文件访问

//1>不同文件中得同名内部变量,互不影响

 

//完整地定义一个外部函数,可以省略

externint a;

 

//定义一个内部函数

staticint b;

 

 

//static int a;

 

void test()

{

    int a =0;

    a++;

    printf("a的值为%d\n",a);

   

    //static修饰局部变量:

    //1>延长局部变量的生命周期:程序结束的时候,局部变量才会销毁

    //2>并没有改变局部变量的作用域

    //3>所有的test函数都共享着一个变量b(把一个函数内常用的变量给与static,能提高性能)

   

    //static修饰局部变量的使用场合:

    //1.如果这个函数的使用频率特别高

    //2.这个函数内部的某个变量值是固定不变的

   

    staticint b=0;

    b++;

    printf("b的值为%d\n",b);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值