iOS 阶段学习第八天笔记(指针)
iOS学习(C语言)知识点整理
一、指针
1)概念:存储变量的地址的一个变量。
2) 数据存储类型分析
1、text (代码段) :存储二进制的可执行代码
2、data(初始化的数据段) 存储初始化的全局变量以及初始化的static修饰的变量,分为只读数据段
(如:字符串常量,整型常量)及可读可写数据段,静态存储。
3、data(未初始化的数据段)存储未初始化的全局变量及未初始化的static修饰的变量,静态存储。
4、heap(堆区) 内存使用需要手动申请,手动释放,空间非常大,通常存储大容量的数据,执行效率比较低
使用比较麻烦,动态存储。
5、stack(栈区)内存空间比较小,函数调用局部变量开辟都是栈上,使用效率非常高。
3)取地址符 “&”,间接寻址符 “ * ”,“%p” 打印地址的格式字符
4)指针标示符:* 例如: int *p 表示定义了一个指针p,*是指针标示,int表示p指向的类型(里面存储的是int型变量的地址)
5)各种类型的指针,在内存中拥有的空间都是一样的,64位系统下面都是8个字节(32位是4个字节)。
6)指针运算 指针对象 ++,表示指向地址向后偏移,偏移量为sizeof(指向的类型);- -则表示向前偏移。
7)野指针:未初始化值的指针,里面是个随机地址,可以任意修改该地址对应的值,会给系统造成不可控制的影响。
8)空指针 p=NULL=0; 0是非法地址,0地址不可赋值,不可读写。
9)指针的优点
1、为函数提供修改调用变量的灵活手段
2、可以使函数有多个返回值
3、可以改善某些子程序的效率 ,在传递数据时,如果数据块较大(比如数据缓冲区域或比较大的结构),这时就可使用指针传递地址而
不是实际数据,即可提 高传输速度,又节省大量内存。
4、为动态数据结构(如 二叉树、链表)提供支持。
10)void* 指针,通配指针,可是指向任意类型。
11)指针的应用,函数中指针作为函数的入参。
12)int *a; 指针变量,指向int型数据。
13)指针数组 即指向一个数组类型的指针
例如: int *p[4] : 表示4个指向int的指针.每个指针都是独立的,没有关系; p[i] 是一个 int 型指针
p[i]=*(p+i)
实例代码:
int add(int *a[],int len1,int len2)
{
int sum = ;
for(int i=;i<len1;i++){
//a[i]第i个指针=第i个一维数组
for(int j=;j<len2;j++){
sum = sum + *(a[i]+j);
}
}
return sum;
} int main()
{
int a[][]={{,,},{,,}, {,,},{,,}};
int *p[];//指针数组,没初始化不能用,野指针组
for(int i=;i<;i++){
p[i]=a[i];//a[i]表示第i行的一个数组
}
int sum = add(p,,);
printf("sum = %d\n",sum);
return ;
}
14)数组指针
实例代码:
int add(int(*p)[],int len)
{
int sum = ;
for(int i=;i<len;i++){
//p+i 表示指向第i个数组 *(p+i)=a[i]
for(int j=;j<;j++){
//a[i][j] = *(a[i]+j) = *(*(p+i)+j)
sum = sum + *(*(p+i)+j);
}
} return sum;
} int main()
{
int a[][]={{,,},{,,}, {,,},{,,}};
//a[0],a[1],a[2],a[3]:4个数组都有3个元素
int(*p)[];//可以指向一个有3个元素的数组
//p = &(a[0]);//&a[0] = &(*(a+0))
p = a;//由上面的那个式子化简
int sum =add(a, );//既然p=a,就可以这么写
printf("sum %d \n",sum);
}
15)函数指针 int (*pfunc)(int,int); 定义了一个函数指针,必须要指向 int XXX(int a,int b) 这种样式的函数
实例代码:
int add(int a,int b)
{
return a+b;
} int main(){
int a = ;
int b = ;
int sum;
int (*pfunc)(int,int); pfunc = add;//函数名相当于一个指向其函数入口指针常量
sum = pfunc(a,b);
printf("sum = %d\n",sum);
return ;
}
16) 使用指针 实现函数回调
实现代码:
void print_hello()
{
printf("hello world\n");
} void print_date()
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
//获取系统本地时间 需要引用 time头文件 ,#include <time.h>
timeinfo = localtime ( &rawtime );
printf ( "%4d-%02d-%02d %02d:%02d:%02d\n",+(*timeinfo).tm_year, +(*timeinfo).tm_mon,
(*timeinfo).tm_mday,(*timeinfo).tm_hour,(*timeinfo).tm_min,(*timeinfo).tm_sec);
} // void(*pfunc)()
void print_all(void(*pfunc)(),int count)
{
for(int i=;i<count;i++){
pfunc();
}
} int main()
{
print_all(print_date,);//循环输出4次
print_all(print_hello,);
return ;
}
17)使用指针实现递归算法
实现代码:
void sort_array(int *a,int len){
//冒泡排序
int temp;
for(int i=;i<len-;i++){
for(int j=;j<len--i;j++){
if(*(a+j)>*(a+j+))
{
temp = *(a+j);
*(a+j) = *(a+j+);
*(a+j+) = temp;
}
}
}
}
int main(){
int a[]={,,,,};
int *p;
p = a;
//传递数组:2种形式 数组或者指针
print_array(a, );
return ;
}
18)二级指针 指向指针的指针。
实例代码:
void swap(int **p,int **q)
{
int temp;
temp = **p;
**p = **q;
**q = temp;
} int main()
{
int a = ;
int b = ;
int *p = &a;//p是一个指针,指向int型
int **q;//q是一个指针,指向 int *型,int* 型就是指向int的指针类型,p就是这样一个类型
q = &p;//*q=*(&p)=p
printf("%d\n",**q);//*q=p,**q=*p=a
int *p_b = &b;
int **pp_b = &p_b;
swap(q,pp_b);
printf("a=%d,b=%d\n",a,b);
return ;
}
19)const 修饰符,只读 表现形式: const 数据类型 变量名 ,const 直接修饰的变量不可以改变,但加了*的变量可修改。
实例代码:
int main()
{
int value1 = ;
int value2 = ;
const int a = ;
printf("a=%d\n",a);
a = ;//const修饰的变量不能修改
const int *p = &value1;
p = &value2;
//*p = 100;//*p不可以修改,p可以改
int const *m = &value1;
m = &value2;
//*m = 10;//*m不可以修改,m可以改
int *const n;//n不可以改,*n可以改
const int *const q//q不可以改,*q不可以改
const int *const m,*n;//m,*m不可以改,n可以改
*n =;//*n也不可以改
const int *const m, *const n;//m,*m,n不可以改
*n = ;//*n也不可以改
int *const m, *const n;//m,n不可以改,*m,*n可以改,
*n = ;
}
iOS 阶段学习第八天笔记(指针)的更多相关文章
- iOS阶段学习第一天笔记(Mac终端的操作)
前言部分 原本从事的是.NET开发,一直在要不要转iOS 中犹豫徘徊,经过复杂的内心挣扎终于鼓起勇气辞职脱产学习iOS;希望通过四个月的 学习后能够拿到理想的薪资.以下是学习过程中的学习笔记,为了方便 ...
- iOS阶段学习第二天笔记(数据类型与进制)
iOS学习(C语言)知识点整理笔记 1.C语言32个关键字 一.存储相关 1)auto 声明自动变量 2)register 声明寄存器变量 3)volatile 声明的变量在程序执行过程中可能被隐含的 ...
- iOS 阶段学习第九天笔记(内存管理)
iOS学习(C语言)知识点整理 一.内存管理 1)malloc , 用于申请内存; 结构void *malloc(size_t),需要引用头文件<stdlib.h>:在堆里面申请内存,si ...
- iOS阶段学习第四天笔记(循环)
iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ } 两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...
- iOS 阶段学习第四天笔记(循环)
iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ } 两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...
- iOS 阶段学习第24天笔记(Block的介绍)
iOS学习(OC语言)知识点整理 一.Block 的介绍 1)概念: block 是一种数据类型,类似于C语言中没有名字的函数,可以接收参数,也可以返回值与C函数一样被调用 封装一段代码 可以在任何地 ...
- iOS阶段学习第21天笔记(ARC内存管理-Copy-代理)
iOS学习(OC语言)知识点整理 一.OC 中的ARC内存管理 1)ARC中释放对象的内存原则:看这个对象有没有强引用指向它 2)strong:强引用,默认情况下的引用都是强引用 3) weak:弱引 ...
- iOS阶段学习第20天笔记(MRC内存管理)
iOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效 OC中采用 ...
- iOS阶段学习第17天笔记(NSFileManager-NSFileHandle-文件操作)
iOS学习(OC语言)知识点整理 一.单例模式 1)单例是一种编程思想,一个设计模式,与语言无关在采用了单例对象的应用程序中,需要单例类自行提供实例化单例对象, 不管实例化单例对象多少次,只有一个对象 ...
随机推荐
- jQuery 绑定事件到动态创建的元素上
在进入主题之前,我们先来看一个前台页面经常用到的功能:点击页面输入框时自动选择其中文本. 很容易想到利用输入框的focus事件,当输入框获得焦点时,再调用jQuery的select()方法. Okay ...
- 《30天自制操作系统》笔记(02)——导入C语言
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...
- Vue 子组件向父组件传参
直接上代码 <body> <div id="counter-event-example"> <p>{{ total }}</p> & ...
- 爱上MVC~为非法进行Action的用户提供HttpStatusCodeResult
回到目录 对一MVC来说,它有Controller和Action,其中Action用来为页面提供数据和相关逻辑,并最后将页面渲染出来,而有些action是需要一些参数的,如文章的最终页,可能需要一个I ...
- Memcache基础教程
Memcache是什么 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力. 它可以应 ...
- Atitit 图像处理30大经典算法attilax总结
Atitit 图像处理30大经典算法attilax总结 1. 识别模糊图片算法2 2. 相似度识别算法(ahash,phash,dhash)2 3. 分辨率太小图片2 4. 横条薯条广告2 5. 图像 ...
- C#:使用Twain协议实现扫描仪连续扫描
如果用Twain协议实现一次扫描多张图片?相信有接触过Twain协议与扫描仪通信的朋友都遇到过这样的问题.按照网上的例子,在连续送纸的扫描仪中,调用一次却只能扫描一张图片,怎么破? 关于这个问题 我研 ...
- 解析大型.NET ERP系统 窗体、查询、报表二次开发
详细介绍Enterprise Solution 二次开发的流程步骤,主要包括数据输入窗体(Entry Form),查询(Query/Enquiry),报表(Report)三个重要的二次开发项目. 数据 ...
- c++实现kd树
#ifndef _KD_TREE_H_ #define _KD_TREE_H_ #include <memory> #include <vector> #include < ...
- codeforces Gargari and Bishops(很好的暴力)
/* 题意:给你一个n*n的格子,每一个格子都有一个数值!将两只bishops放在某一个格子上, 每一个bishop可以攻击对角线上的格子(主对角线和者斜对角线),然后会获得格子上的 数值(只能获取一 ...