01-指针和数组(新)
只要一个指针指向了数组,那么 访问数组就有3种方式
1.: age[0]
2.: p[0];
3.: *[p+0];
4.: 0[p]
02-指针和字符串
保存 字符串的两种方式:
char str[] = "lyh";
存储的位置 : 栈
特点 : 相同的字符串 会重复的分配存储空间
字符串可以修改
char *str = "lyh";
存储的位置 : 常量区
特点 : 相同的字符串 不会重复的分配存储空间
字符串不可以修改
通过数组保存字符串 和 通过指针保存字符串的区别
如果通过 数组来保存字符串 , 那么字符串是一个变量 str 可以修改
如果通过 指针来保存字符串 , 那么字符串是一个常量 str2 不能修改
数组保存的字符串 存储在内存的 栈中,而通过 指针保存的字符串 存储在 常量区
存储在 栈中的变量有一个特点, 当作用域结束, 系统就会自动释放该变量
存储在 常量去 的值有一个特点, 不会被释放,而且多个相同的值 对应的地址相同
03-指针和字符串-注意点
注意: 用指针来保存字符串 不可以被改变
指针没有初始化 不能随便使用
04-指针数组
定义数组的格式 : 元素类型 数组名称[元素的个数]
05-指针变量作用
指针保存的数据 存在常量区,常量区 不会自动释放.所以外面能获取到值
06-指针综合练习
要求自己实现strlen函数
四个知识点
1.任何数值都有真假性 (1真 0假)
2.++在前 ++在后的特性 (i++ 先获取之前的值,再自增1 --- ++i 先自增1,在操作)
3.指针+1是加多少 加上指针类型的所占用的字节(char *p p+1 = p+1 --- int *p p+1 = p + 4)
4.循环只会执行离他最近的一条语句
07-指向函数的指针-基本概念
对OC的block有一定好处
函数也会占用一块存储空间
函数也会占用一块存储空间,所以函数也有自己的地址
函数的地址保存在函数名中
函数名就是函数的地址 == 数组名就是数组的地址
指向函数的指针的定义格式
void (*funtionP) ();
* : 代表一个指针
funtionP : 代表指针变量的名称, 区分
(*funtionP) : 代表将来指向一个函数
void : 代表将来 指向的函数 没有返回值
() : 代表将来 指向的函数 没有参数
---
没有返回值 没有参数
没有返回值 有参数
有返回值 没有参数
有返回值 有参数
08-指向函数的指针-应用场景
定义一个方法,给你两个数,用户要求你做加法,你就做加法,用户要求你做减法,那你就做减法
int demo3(int v1,int v2,int (*p)())
{
return p(v1,v2);
}
printf("sum = %i\n",demo3(10, 20,sum));
printf("minus = %i\n",demo3(10, 20,minus));
09-指向函数的指-针练习
#pragma 1.要求用户输入一段英文,将用户输入的英文单词所有的首字母大写
10-结构体-基本概念
如何定义一个结构体变量
1.定义结构类型
2.根据结构体类型,定义结构体变量
struct 结构体类型名称
{
属性;
};
11-结构体-初始化
1.定义的同时 初始化
2.先定义再初始化
3.先定义再初始化(一次性初始化)
4. 指定将数据赋值 给指定的属性
12-结构体-内存存储细节
注意: 定义结构体类型 并不会 分配存储空间
只有定义结构体变量 才会 真正的分配存储空间
结构体 会首先找到 所有属性 中 占用内存存储空间最大的那个属性,然后按照该属性的倍数类型分配存储空间
1.找到结构体类型 中 占用存储空间最大的属性, 以后就按照 该属性 占用的存储空间1 来分配(在当前这种情况 每次分配8个字节)
2.会从第0个属性 开始分配存储, 如果存储空间 不够 就会重新分配,如果存储空间 还有剩余, 那么就会把后面的属性的数据存储到剩余的存储空间中
13-结构体-类型定义方式
1.先定义结构类型, 再定义结构体变量
2.定义结构体类型的同时 定义结构体变量
3.定义结构体类型的同时 定义结构体变量, 并且省略结构体名称
14-结构体-类型作用域
相同作用域 不能有同名的结构体类型
如果变量 写到函数或者代码块外面, 那么就不是局部变量,而是全局变量
全局变量的作用域 是从定义的哪一行开始, 知道文件末尾 (暂时这样理解)
15-指向结构体的指针
/*
控制台 可以通过 po 输入其他当前的界面获取属性的值
如何定义 指向结构体变量的指针
1.拷贝 结构体类型 和 结构体变量名称
2.在类型 和名称中间加上一颗星
当指针 指向结构体之后 如何利用指针访问结构体
结构体变量名称.属性;
(*结构体指向变量名称).属性;
结构体指针变量名称->属性;
*/
16-结构体-数组
要求定义变量保存 公司所有部门的绩效(部门名称,部门人数,绩效)
17-结构体-嵌套
注意 : 如果结构体的属性 又是一个结构体,那么可以通过连续.的方式,访问结构体属性中的属性
如果结构体类型中的属性 又是一个结构体,那么赋值时候通过{}赋值
18-结构体和函数
1.将结构体属性传递给函数,在函数中修改形参 不会影响到实参
2.将结构体名称 作为参数传递, 在函数中修改形参 不会影响到实参
结构体之间赋值是 值传递, 系统会将结构体的值 拷贝一份 到 B结构体中
19-枚举-基本概念
枚举就是 专门用于 表示集中固定类型的取值
枚举的本质 就是基本数据类型, 就是整型
枚举和结构体一样,要想定义枚举类型变量,那么必须先定义枚举类型
枚举类型定义的格式
enum 枚举类型名称
{
取值,
};
定义枚举类型的规范
枚举类型的取值一般以k开头,后面跟上枚举的名称, 跟上当前取值的含义
和结构体一样,枚举类型的名称 首字母大写