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 阶段学习第八天笔记(指针)的更多相关文章

  1. iOS阶段学习第一天笔记(Mac终端的操作)

    前言部分 原本从事的是.NET开发,一直在要不要转iOS 中犹豫徘徊,经过复杂的内心挣扎终于鼓起勇气辞职脱产学习iOS;希望通过四个月的 学习后能够拿到理想的薪资.以下是学习过程中的学习笔记,为了方便 ...

  2. iOS阶段学习第二天笔记(数据类型与进制)

    iOS学习(C语言)知识点整理笔记 1.C语言32个关键字 一.存储相关 1)auto 声明自动变量 2)register 声明寄存器变量 3)volatile 声明的变量在程序执行过程中可能被隐含的 ...

  3. iOS 阶段学习第九天笔记(内存管理)

    iOS学习(C语言)知识点整理 一.内存管理 1)malloc , 用于申请内存; 结构void *malloc(size_t),需要引用头文件<stdlib.h>:在堆里面申请内存,si ...

  4. iOS阶段学习第四天笔记(循环)

    iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ }  两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...

  5. iOS 阶段学习第四天笔记(循环)

    iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ }  两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...

  6. iOS 阶段学习第24天笔记(Block的介绍)

    iOS学习(OC语言)知识点整理 一.Block 的介绍 1)概念: block 是一种数据类型,类似于C语言中没有名字的函数,可以接收参数,也可以返回值与C函数一样被调用 封装一段代码 可以在任何地 ...

  7. iOS阶段学习第21天笔记(ARC内存管理-Copy-代理)

    iOS学习(OC语言)知识点整理 一.OC 中的ARC内存管理 1)ARC中释放对象的内存原则:看这个对象有没有强引用指向它 2)strong:强引用,默认情况下的引用都是强引用 3) weak:弱引 ...

  8. iOS阶段学习第20天笔记(MRC内存管理)

    iOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效      OC中采用 ...

  9. iOS阶段学习第17天笔记(NSFileManager-NSFileHandle-文件操作)

    iOS学习(OC语言)知识点整理 一.单例模式 1)单例是一种编程思想,一个设计模式,与语言无关在采用了单例对象的应用程序中,需要单例类自行提供实例化单例对象, 不管实例化单例对象多少次,只有一个对象 ...

随机推荐

  1. Git 远程仓库搭建

    大名鼎鼎的git就不多做介绍了,总之.我们使用git来作为项目的一个版本控制工具,多人开发的项目的时候会轻松很多. 安装git whthomas@whthomas:~/workplace/gitOne ...

  2. 用curl向指定地址POST一个JSON格式的数据

    昨天的一个任务,用POST 方式向一个指定的URL推送数据.以前都用的数组来完成这个工作. 现在要求用json格式.感觉应该是一样的.开写. <?php $post_url = "ht ...

  3. [问题解决]安装 SQL Server 无法开启NetFx3.5 的错误

    谷歌了一下,该问题是由于系统中缺少.Net3.5相关特性造成的.需要手动安装一下3.5的环境 解决办法: Windows 徽标键+R打开运行窗口 输入Dism /online /enable-feat ...

  4. 对Google cloud platform 做了点研究

    Google也推出了云计算基础服务, 加上微软Azure,亚马逊AWS, 都齐活了. 下面是研究了一下对其的一个初步了解. 计算: Compute Engine     IaaS平台,提供VM,操作灵 ...

  5. Atitit 图像处理 灰度图片 灰度化的原理与实现

    Atitit 图像处理 灰度图片 灰度化的原理与实现 24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB.通常,许多24位彩色图 ...

  6. DOM_06之定时器、事件、cookie

    1.定时器:①任务函数:函数结尾判断临界值:②启动定时器:a.周期性:timer=setInterval(任务函数,interval):b.一次性:timer=setTimeout(任务函数,wait ...

  7. MySQL5.7.13源码编译安装指南

    系统 CenterOs 6.5 1.安装依赖包(cmake make gcc等,其实好多都有了,不需要更新,为了防止世界被破坏,就装下) yum install gcc gcc-c++ -yyum i ...

  8. Netty学习三:线程模型

    1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发.高吞吐量的环境中进行I/O处理. I/O多路复用机制都依赖于一个事件分发器,事件 ...

  9. JS原生第二篇 (帅哥)

    1.1 Javascript 作用  1.  网页特效 2. 用户交互 3. 表单验证 Js  就是可以用来控制   结构  和 样式 . 1.2  体验js   认识常用的三个输出语句.  都属于 ...

  10. SQL*Loader之CASE5

    CASE5 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase5.sql set termout off rem host write sys$output &quo ...