A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐荘 中级黑马   /  2016-8-6 00:07  /  1110 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文




#pragma mark - 简单知识回顾

1.多文件开发体验
    C语言中 分模块开发,一个模块:
    .h(头文件):函数的声明
    .c(实现文件):函数的实现
2.数据类型所占的字节数(64位编译器)
    char  1个字节
    short 2个字节
    int float 4 个字节
    double long  8个字节
3.其他的数据类型 我们可以用 sizeof 运算符
格式: sizeof(数据类型/变量名/常量)
sizeof(char类型的变量): 1个字节
sizeof(char类型的常量): 4个字节

4. 有一堆苹果 255个, 要求 把255个苹果 封装到8个箱子中
    要求 顾客来买0-255个苹果中的任意数量,都可以用8个箱子中的某几个给他.

#pragma mark - 0_22 [理解]深入变量的细节


1.局部变量是存在"栈区"的,栈区的地址是从高到底分配的[了解]


2.存储数据的时候,怎么存储的?[了解]
    数据以二进制的补码形式进行存储
    数据存储的时候,高位存储在高地址 低位存储在地地址



3.变量的地址:是指最低位所在内存的地址{重点}

4.如何取出变量的地址:[重点]
    &取地址符
    printf("%p\n",&变量名);

#pragma mark - 0_23 [掌握]int类型的修饰符


1,int类型的修饰符有几个?作用是什么?
有3个,作用是指定int类型的变量在内存中占用的字节数
    1>short 修饰  2个字节   %hd 输出
    2>long 修饰   8个字节   %ld 输出
    3>long long修饰  8个字节 %lld输出

#pragma mark - 0_24 [理解]有符号和无符号

1.所谓的无符号 只指 二进制中最高位不表示正负 ,而是直接参与数据的表示


2.无符号的用什么关键字来修饰?unsigned


3.被unsigned修饰的变量有什么特点?
    最小值为0 最大值变为原来的两倍

4.输出形式
    unsigned int---> %u
    unsigned short---->%hu
    unsigned long---->%lu [重点]
    unsigned long long --->%llu

#pragma mark - 0_25 [理解]char变量的深入

1,char变量是如何存储的? char ch = 'a';
    首先会把'a'的ASCII码查出来, 把97转成二进制的补码进行存储

2.打印的时候
    用%c打印 是把补码取出 转成97 接着查表 -->'a'
    用%d打印 是把补码取出 转成97 直接输出

#pragma mark - 01 [掌握]格式控制符的总结

1.因为不同类型的数据在变量中存储的形式是不一样的.
    所以在读取变量中的数据的时候,类型不同读取的方式也不同.

2.再所以为了保证可以正确读取出存储在变量中的数据,
        我们应该使用"正确"的格式控制符.
注意:没有必要去研究 错误的格式控制符 输出的数据是为什么


3. 格式控制符的总结.
    int类型的格式控制符 int num = 10;

    读取int整型的数据.以十进制的形式输出****  %d
    读取int整型的数据.以八进制的形式输出.      %o
    读取int整型的数据.以十六进制的形式输出       %x

    int被修饰符修饰后的格式控制符

    short   %hd
    long        %ld
    long long       %lld

    unsigned int    %u
    unsigned short  %hu
    unsigned long  ****** %lu
    unsigned long long  %llu

    实型:
    float:  %f  如果想保留几位小数 %.mf m表示保留的小数位数
    double: %lf 如果想保留几位小数 %.mlf m表示保留的小数位数

    字符型:
    char:  %c  注意如果你用%d输出,但是输出的是ASCII码

    地址:  %p

"注意:
    数据以什么形式进行存储的 那么就用什么格式控制符输出
#pragma mark - 02 [了解]垃圾值的由来

1.如果你定义了一个局部变量
    给局部变量初始化一个值 一般来说是0
2.当你定义一个全局变量的时候 可以不用初始化 因为系统会自动清零

=================重点开始了================
#pragma mark - 03 [听懂]数组的概述

1,是什么数组?
{是用来存储一组数据的容器.
}

2,数组有什么用?
{用于把同一类型的一组数据统一管理起来.
}

3,什么时候用?
{当需要管理一组有关联的数据时.
}

#pragma mark - 04 [掌握]如何声明数组

1.声明数组的语法
    数据类型 数组名[数组的长度]; int arr[3];
    数据类型:指的是 数组中每一个元素的数据类型
    数组名 一定是不包含中括号

2.几个专业术语

    1>元素: 数组中的每一个小空间
    2>下标/索引:元素中数组的位置 从0开始
    3>长度:数组中元素的个数 也就是这个数组最多能容纳的数据的个数
定义一百个变量:
    int num = 10;
    int nums[100];


#pragma mark - 05 [掌握]如何往数组中存储数据

1.如何给数组的元素赋值?
    数组名[下标] = 100;

#pragma mark - 06 [了解]元素的本质是1个普通变量

比如:语句float arr[4];
    本质上 是在内存中定义 4个float的变量
    每一个变量分别叫:arr[0],arr[1],arr[2],arr[3]

    arr[0]就是一个普通变量,只能赋值1次 如果赋值 原来的值会被覆盖

#pragma mark - 07 [掌握]为元素赋值的时候注意两点

1.为元素赋值的时候,赋值的数据类型 要和 元素的类型一致



2.赋值的时候 下标不能越界:如果下标越界 就产生难以预料的结果



提示:
如果你的程序中有用到数组,而且程序一次运行没问,第二次崩溃了,第三次又没问题了,那么很可能,就是你的数组越界了

#pragma mark - 08 [掌握]如何取出存储在数组中的数据

"我们要取出的是数组中元素的数据
假设有一个数组:
    int nums[3];
    num[0] = 10;
    num[1] = 1000;
    num[2] = 100;
1.要取出某一个元素
   int num1 = 数组名[元素的下标];


2.注意:
    下标不能越界
#pragma mark - 09 [掌握]数组的遍历(数组中的元素挨个取出)

1.遍历数组的通用公式
    假设有数组 int nums[数组的长度];

    for(int i = 0;i < 数组的长度;i++){
        nums[i];//这个就是数组中的每一个元素
        //打印每一个元素
        //可以求和
        //比较求最大值,求最小值...
    }

/*
"练习
定义一个含有3个元素的double类型的数组,赋值,并"遍历打印"出数组的每一个元素!


1.数组的定义
数据类型 数组名[数组长度];

2.数组的元素赋值
数组名[下标] = 100;

3.数组的遍历和数组元素的打印

for(int i = 0 ; i < 数组的长度;i++){
    printf("%d",数组名[i]);
}


*/
#include <stdio.h>

int main(int argc, const char * argv[]) {
    // insert code here...
    double nums[3];//定义了一个三个元素的 double类型的 数组
    nums[0] = 3.14;
    nums[1] = 4.56;
    nums[2] = 5.67;
    //遍历打印
    for (int i = 0; i < 3; i++) {
        //每一个元素 nums[i]
        printf("%.2lf\n",nums[i]);
    }  
    return 0;
}

#pragma mark - 10 [掌握]关于数组的长度

1.声明数组的时候 必须要指定数组的长度


2.数组的长度一般是常量.
    还以是变量或者表达式(长度就是表达式的结果),还可以是个字符(长度是字符的ASCII码)
    int len = 5;
    int nums[len];
    数组的长度是一个变量,在C99中不允许,但是xcode可以
3.数组的长度不能是小数,不能是负数

4.数组的长度可以是1,可以是0,但是没有意义

思考:写一段程序
    定义一个用户指定长度的数组?怎么弄?
    int len = 0;
    scanf("%d",&len);
    int nums[len];

#pragma mark - 11 [掌握]数组的元素的默认值和初始化

1.声明一个数组却没有为数组的元素赋值,那么他里面的每一个元素都是一个垃圾值


2.关于数组元素的初始化:
    1>定义的同时初始化:静态初始化
        "注意:使用这种方法初始化 数组的长度就不能用变量
        int nums[5] = ...//
        1)int nums[3] = {1,2,3}//指定长度全部初始化
        2)int nums[] = {1,2,3,4}//不指定长度全部初始化
        3)int nums[5] = {1,2}//指定长度 部分初始化
        //奇葩初始化
        4)int nums[5] = {[0] = 10,[3] = 50}

        只要是静态初始化,那么其中如果某些元素没有初始化,他的默认值0


    2>先定义后初始化: 动态初始化
        只有一种方式:挨个赋值,如果有某些元素没有赋值 那么默认值是垃圾值
    int nums[5];
        nums[0] = 10;


3.要将数组中的所有元素初始化为0,怎么办?
    int nums[10] = {0};

4.这么赋值行不行?
    int nums[6];
    nums = {1,2,3,4,5,6};



    int num = 0;
    scanf("%d",&num);
    int arr[num];//这样不会报错


    int num = 0;
    scanf("%d",&num);
    //C99中 数组的长度 不能是变量
    //xcode不彻底
    int arr[num] = {0};//这样回报错why??

#pragma mark - 12 [掌握]课堂演练

/*有1个学习小组(5人),输入每1个人的成绩.输入完毕之后 请将这5个人成绩打印出来.*/
int nums[5];// nums[0] nums[1]..nums[4];

for (int i = 0; i < 5; i++) {
    printf("请输入第%d个人的成绩\n",i+1);
    scanf("%d",&nums[i]);
}
printf("5个人的成绩分别是:\n");


for (int i = 0; i < 5; i++) {
    printf("第%d个人的成绩是%d\n",i+1,nums[i]);
}

#pragma mark - 14 [了解]数组在内存中的存储形式

1.数组在内存中也是从高字节向低字节申请"连续"的 (数组的长度 * 每1个元素的字节数) 个字节的空间


2.假设有数组 int nums[3];
    下标为0的元素 存储在低字节 假设首地址 0xff01
    下标为1的元素  的首地址 0xff05
    下标为2的元素  的首地址 0xff09

#pragma mark - 15 [掌握]数组的地址问题

1.数组的地址 == 数组中的最低字节的地址 == 数组中下标为0的元素的低字节的地址 ==  数组中下标为0的元素的地址 == 数组名

2.数组名:其实是一]个变量,这个变量存储了数组的地址
所以说 打印 数组名的时候 应该用%p占位符
#pragma mark - 16 [掌握]数组的长度的计算

1.这里我们指的长度 是指数组中元素的个数
    int nums[4];
  数组在内存中占的总的字节数/单个元素的字节数 = 个数
    int nums[] = {1,2,34,5,67,6,456,786};
    int len =  数组在内存中占的总的字节数/单个元素的字节数
            =  sizeof(nums)/sizeof(int)
公式:
  数组在内存中占的总的字节数/单个元素的字节数 = 数组的长度

#pragma mark - 17 [掌握]关于数组你必须要会的四种简单算法

1). 给你1个整型的数组,找出这个整型的数组中的最大值.

2). 给你1个整型的数组,找出这个整型的数组中的最小值.

3). 给你1个整型的数组,求这个整型的数组中的累加和.

4). 给你1个整型的数组,求这个整型的数组中的平均值

#pragma mark - 18 [掌握]判断数组中是否包含指定的元素

思路:
1>循环 遍历每一个元素

2>判断 这个数 是不是跟 某一个元素相等

3>如果相等 就是包含,如果不相等 下一个继续判断


4>这个循环始终会结束
    需要知道 这个循环过程中 到底找没找到这个元素的值

    int key = 50;
    int nums[] = {13,12,343,45,635,46,756,8};
    int len = sizeof(nums)/sizeof(nums[0]);
    int flag = 1000;
    for( int i = 0;i < len;i++){
        //取出每一一个元素
        if(nums[i] == key){
            //找到了
            printf("zhaodaole \n");
            flag = 9999;
            break;
        }else{
//            printf("meizhaodao\n");
            //因为找没找到,只有到循环结束之后才知道
        }
    }
    //循环结束 判断找没找到的第一种方式
//    if(i == len){
//        printf("没找到");
//    }
    ////循环结束 判断找没找到的第二种方式
    if(flag == 1000){
         printf("没找到");
    }
#pragma mark - 19 [掌握]找指定的元素在数组中第1次出现的下标
#include <stdio.h>
int returnIndex(int num)
{
    int nums[] = {1,2,4,5,7,91,9,90,345,76,54,67};
    //1.遍历数组
    int len = sizeof(nums)/sizeof(int);
    for (int i = 0; i < len; i++) {
        //nums[i]
        if (num == nums[i]) {
            return i;
        }else{
            //仅仅表示这一次没找
            //            return -1;
        }
    }
    //循环结束之后 才知道到底找没找到
    //2.比较 num 和 每一个元素
    //3.如果相等 直接return 下标
    //4.如果不相等 继续 直到循环结束为止
    return -1;
}


































































2 个回复

倒序浏览
加油!顶顶顶
回复 使用道具 举报
不错,希望有用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马