iOS开发-前言篇C-指针以、结构体指针、作用域
来源:互联网 发布:淘宝v2贷款怎么搞 编辑:程序博客网 时间:2024/06/06 03:35
1:指针
指针变量的定义和使用
存放内存地址的变量 指针变量所占的字节数只和操作系统有关
int *p = NULL; 初始值NULL恒为0
变量类型 : 整型指针
指针变量也是变量。它可以储存地址,它本身也有自己的地址
取址运算符
&
取值运算符
*
指针的算数运算(加,减)
int *p = &a;
p++; // 向高位移动四个字节
p—; // 向低位移动四个字节
指针类型决定移动几个字节
指针变量的赋值意味着重指向(重新被定值)
数据的存储’
字节是最小的存储单元 一个字节称为一个存储单元,不同数据类型所占用的存储单元不等
为了正确访问内存单元,每个内存单元都有一个编号,内存单位的编号称作地址
内存单元中的内容才是我们关注的数据
访问方式
数据访问一般分为直接访问和间接访问
直接访问 例如 a=20;
间接访问 通过内存单元编号以及数据所占字节数访问内存中的数据
间接访问在程序随处可见,指针就是间接访问方式
*p {指针变量取值时,访问内存地址为p的存储区域
指针变量定义时,只是起到修饰作用 告诉编译器P是指针
数组的数组名是数组元素的首地址
*(p+2) = 6 数组里第三个元素会发生变化
指针可以当数组名使用
P[1] = 3;
数组名不可以++ 指针可以++
数值名是常量地址 不能重指向,指针可以 不能用指针算出数组元素的个数
恒等于a[1]
恒等于*(p+1)
恒等于*(a+1)
存放指针的数组成为指针数组
指针与函数
数据类型 函数名(参数列表);
数据类型 (*函数指针变量名)(参数列表);
2:结构体指针
指向结构体变量的指针叫结构体指针
typedef struct student Stu;
Stu stu1 = {0};
Stu *p = &stu1;
(*p).sex = ‘m’
p->sex = ‘m’,
*p 对指针变量取值后是结构体变量 .sex是访问成员变量,指针可以直接访问 即 p->sex = ‘m'
只有把结构体变量地址先赋值给结构体变量指针变量,结构体指针变量才可以获取结构体变量的成员变量存储的内容
结构体数组与指针的关系
结构体数组的数组名是一个结构体指针常量
Stu stus[3] = {0};
Stu *p = &stus;
(p+i)->num
结构体指针变量是通过指向符来访问结构体变量的成员变量的
void printStudent(Stu *pstu,int count);
函数操作结构体数组,需要传入首地址和元素个数
预编译指令
步骤 写代码 - 连接 - 编译 - 打包
在编译前开始预编译
宏名命名规则
纯大写 或者 k+驼峰
普通宏
#define PI 3.1415
作用 按不同的条件,编译笔筒的代码
条件编译有三种
#ifdef 标示符
代码段1
#else
代码段2
#endif
如果标示符被#define过,编译器编译代码段1,否者编译代码段2
#ifndef 标示符
代码段1
#else
代码段2
#endif
如果标示符未被#define编译器编译代码段1,否者编译器代码
指向结构体变量的指针叫结构体指针
typedef struct student Stu;
Stu stu1 = {0};
Stu *p = &stu1;
p->sex = ‘m’,
*p 对指针变量取值后是结构体变量 .sex是访问成员变量,指针可以直接访问 即 p->sex = ‘m'
只有把结构体变量地址先赋值给结构体变量指针变量,结构体指针变量才可以获取结构体变量的成员变量存储的内容
结构体数组的数组名是一个结构体指针常量
Stu stus[3] = {0};
Stu *p = &stus;
结构体指针变量是通过指向符来访问结构体变量的成员变量的
函数操作结构体数组,需要传入首地址和元素个数
步骤 写代码 - 连接 - 编译 - 打包
在编译前开始预编译
宏名命名规则
纯大写 或者 k+驼峰
普通宏
#define PI 3.1415
作用 按不同的条件,编译笔筒的代码
条件编译有三种
#ifdef 标示符
代码段1
#else
代码段2
#endif
如果标示符被#define过,编译器编译代码段1,否者编译代码段2
#ifndef 标示符
代码段1
#else
代码段2
#endif
如果标示符未被#define编译器编译代码段1,否者编译器代码
3:作用域{
所有在(栈区)都是有计算机主动分配释放的区域 函数左大括号开始,右大括号结束后收回 int a = 3;
局部变量
}
不被计算机应用程序主动收回的存储空间,为了提高计算机的运行效率
储存区的划分
所有在(栈区)都是有计算机主动分配释放的区域 函数左大括号开始,右大括号结束后收回 int a = 3;
堆区 计算机程序编写人员主动分配和主动收回的 malloc(255)
静态区 不受计算机和程序员的管辖 static float h = 1.36;
常量区 不受计算机和程序员的管辖 “lanou”
代码区 计算机在编译完成后,一条条实现的指令 void func(){…}
从上到下 内存地址由高到低
单项值传递(只能向下传)
字符数组最后一位是’\0’ 就是字符串变量
字符串常量不能更改
如 char *string = “iphone”; string[0] = ‘a’; 运行崩溃 ,因为*string 后面的是一个常量
字符数组变量可以改
如 char string[] = “iphone”; string[0] = ‘a’; 可以更改成功
char *string = {‘i’,’p’,’\n’};
string[0] = ‘a’;
静态储存区
static int a = 5;
static char string[255];
只初始化一次
如果初始值没给,默认值为0
只有程序退出才释放
将变量定义的类型前加static 则该变量存储在静态储存区
堆区
malloc 等内存分配函数的内存 手动分配,手动释放
所有的语句编译后会生成cpu指令存储在代码区
堆内存分配函数
void *malloc(unsigned int size//需要分配的字节长度);返回的分配完的内存的首地址
返回值是不确定类型的指针变量
其他内存分配函数
void * calloc(unsigned n,unsigned size); calloc 复制的意思
分配n个size大小的空间。并且把该内存上的所有字节清零
void * realloc(void*p,unsigned newsize); realloc 从新分配
按给定的地址以及给定的大小从新分配
内存操作函数
将字符串转换成整型,然后进行计算 char *s = “1234”; int value = atoi(s);
初始化内存
void *memset(void *s,int c, size_t n) 从s指向的内存开始初始化n个字节的内容为c
字符串拷贝
void *memcpy(void *dest,const void*source,size_t n); 从source 指向的内存开始拷贝到dest 拷贝n个字节
内存比较
int memcmp(const void *buf1,const void *buf2,unsigned int count)
sizeof 不是 一个函数,是一个运算符 -> 指针运算符 应用程序的最小单位是函数
1 0
- iOS开发-前言篇C-指针以、结构体指针、作用域
- iOS开发-前言篇C-结构体
- IOS开发---C语言-⑰指向结构体的指针
- c-指针学习篇前言
- C指针 作用域
- 黑马程序员——ios开发基础之C语言数组、指针与结构体
- iOS开发-C语言-指针
- C/C++:结构体指针
- 黑马程序员IOS-C语言-指针、变量作用域
- C语言指针-----指针与结构体
- 【iOS开发】IMP指针的作用
- iOS C语言9_结构体指针
- 学历iOS开发纪录(结构体和数组指针)
- c语言结构体指针
- C语言---结构体指针
- C-045.结构体指针
- 【C语言】结构体指针
- c指针和结构体
- php搜索功能
- JS-运算符
- ASCII表、ASCII扩展表
- 建立网络连接的基本步骤及NSJSONSerialization(苹果自带)——JSON解析
- 知乎下拉刷新SwipeRefreshLayout下拉刷新用法类似知乎下拉刷新
- iOS开发-前言篇C-指针以、结构体指针、作用域
- mjpg-streamer在pcduino上的应用
- [LeetCode] Binary Tree Paths
- SpringMVC注解之看一眼
- windows安装kivy最少走弯路的方法
- button按钮大小
- c语言 参数个数可变函数
- lightoj1245 - Harmonic Number (II)【数学】
- 七种常见排序算法的总结