黑马程序员-IOS-C语言基础-函数及内存剖析

函数

--------------------------------------  android培训 java培训 ios培训期待与您交流! ---------------------------------
1,定义及格式
<1>把常用的功能函数封装起来,方便日后调用。
<2>返回值类型 函数名(形式参数列表)
{
函数体
}
<3>注意点:

1.默认情况下,不允许有函数的名称一样

 2.函数不能嵌套定义

 3.函数不能重复定义,但是可以重复声明

 4.如果有函数的声明,没有函数的定义

 1> 编译可以通过,因为编译器只会检测语法合不合理,并不会检测函数有没有定义

 2> 链接报错,因为链接的时候会检测函数是否定义

2,函数的参数

 1>形式参数:定义函数时函数名后面中的参数 ,简称形参
 2>实际参数:调用函数式传入的具体数据,简称实参
 3>实参个数必须等于形参个数
 4>函数体内部不能定义和形参一样的变量
 5>如果是基本数据类型作为函数形参,纯粹是值传递,修改函数内部形参的值,并不会影响外面实参的值

 6>一个函数可以没有形参,也可以有无限多个形参

内部函数:

如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static

外部函数:

(1) 在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。

如函数首部可以写为

   extern int fun (int a, int b)

(2) 在需要调用此函数的文件中,用extern声明所用的函数是外部函数。


3,return的作用:

 1> 退出函数

 2> 返回一个具体值给函数调用者

4,返回值注意点

 1> void代表没有返回值

 2> 如果没有明确说明返回值类型,默认是返回int类型

 3> 就算明确声明了返回值类型,也可以不返回任何值

 默认情况下,C语言不允许两个函数的名称一样

练习:

#include <stdio.h>

//声明函数
double avr(int a, int b);
int pows(int base,int n);
int pieAdd(int n);
int main()
{
    int a = 3;
    int b = 8;
    avr(a,b);
   // pows(a,b);
    //pieAdd(b);
    return 0;
}
//1.编写一个函数double avr(int a, int b),计算a和b的平均值
double avr(int a, int b)
{   //定义变量c记录平均值
    double c =(a+b)/2.0;
    //%.2f小数点后保留两位数
    printf("%.2f\n",c);
    //返回平均值
    return c;
}
//2.编写一个函数int pows(int base, int n)返回base的n次方
int pows(int base,int n)
{
    //定义变量m记录base的n次方
    int m =1;
    for (int i=0; i<n ; i++)
    {
        m = m *base;
    }
    printf("%d\n",m );
    //返回base的n次方
    return m ;
}
//3.编写一个函数int pieAdd(int n),计算1+2+3+……+n的值并返回。比如pieAdd(3)的返回值是1+2+3=6
int pieAdd(int n)
{
    //定义变量sum记录和
    int sum = 0;
    //定义被加数
    int x = 0;
    while (x < n)
    {
        x++;
        sum += x;
    }
    printf("和是:%d\n",sum );
    return sum;
}
5,#include <stdio.h>作用

 1> 作用:拷贝右边文件的所有内容到#include所在的位置

 2> 自定义的文件用" ",系统自带的文件用<>

 3> #include <stdio.h>的目的:拷贝函数的声明

内存分析

1,进制:
1>,二进制
<1> 特点:只有0和1,逢2进1
<2>书写格式:0b或者0B开头
<3>使用场合:二进制指令或者二进制文件,变量在内存中就是以二进制的形式存储的。
<4>二进制和十进制的互相转换
<5>n为二进制位所能表示的数据范围(不考虑负数):0~2的n次方-1
2>,八进制
<1>特点:0~7,逢8进1
<2>书写格式:以0开头
<3>八进制和二进制的互相转换
3>,十六进制
<1>特点:0~F或0~f,逢16进1
<2>书写格式:以0x或者0X开头
<3>十六进制和二进制的互相转换

2,变量的存储
1>,变量所占用的字节数


2>变量实例:
内存由大到小寻址;只存储二进制形式;第一个字节的地址就是变量的地址。
查看内存地址的方式:%x和%p
// 输出整数的二进制形式
void putBinary(int n)
{
    int bits = sizeof(n) * 8;
    while (bits-->0) {
        printf("%d", n>>bits&1);
        if (bits%4==0) printf(" ");
    }
    printf("\n");

3>,变量的取值范围


3,类型说明符
1>不同类型所占用的存储空间

2> signedunsigned的区别
  <1>,signed int 等价于signed,  unsigned int 等价于unsigned
  <2>,signed和unsigned的区别就是它们的最高位是否要当做符号位,
   signed:表示有符号,也就是说最高位 要当做符号位,所以包括正数、负数和0。
   unsigned:表示无符号,也就是说最高位 并不当做符号位,所以不包括负数。

4,位运算
1> & 按位与  

只有对应的两个二进制均为1时,结果位才为1,否则为0.例如:9&5,其实就是1001&101=1,因此9&5=1

规律:二进制中,与1相&就保持原位,与0相&就为0
2> | 按位或
只要对应的二个二进位有一个为1时,结果位就为1,否则为0。例如:9|5,其实就是1001|101=1101,因此9|5=13
3> ^按位异或
当对应的二进位相异(不相同)时,结果为1,否则为0。例如:9^5,其实就是1001^101=1100,因此9^5=12
规律:1,相同的整数相^的结果是0。例如:1^1=0
2, 多个整数相^得结果跟顺序无关。
3,所以:a^b^a=b
4> ~ 取反
对整数a的各二进位进行取反,符号位也取反(0变1,1变0)
5> << 左移
1,把整数a的各二进位全部左移n位, 高位丢弃 低位补 0 。左移n位其实就是乘以2的n次方。
2,由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性。
6>  >>右移
1,把整数a的各二进位全部右移n位, 保持符号位不变。右移n位其实就是除以2的n次方。

2,为正数时,符号位为0,最高位补0。

3,为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。


5,char 类型

1>存储细节--->ASCII码表

2> 在-128~127范围内,可以当做整型使用

3> %c和%d %i 的使用--->printf(“%d”, ‘A’);printf(“%c”, 68);

4> 转义字符:\0  代表一个空字符。

练习:

#include <stdio.h>
//大小写字母的转换
int main()
{
    //声明字母转换函数
    char conversion(char);
    //定义char类型的变量h
    char h;
    //提示用户输入字母
    printf("请输入一个字母:\n");
    //接收用户输入的字母
    scanf("%c",&h);
    char c = conversion(h);
    //打印出转换后的字母
    printf("转换后的字母:\n%c\n",c);
    return 0;
}

char conversion(char c)
{
    
    if (c >='a' && c <='z')
    {
        //如果输入的字母是小写,则将其转换为大写
        return c - ('a'-'A');
    }else if (c >='A' && c <='Z')
    {
        //如果输入的字母是大写,则将其转换为小写
        return c + ('a'-'A');
    }
    
    return c ;
}


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值