#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;
}
|
|