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. zk系列-zookeeper概述

    接触zk是2年前了,最近工作又比较依赖于zk,所以准备起个系列文章,系统的总结下. zookeeper是一个分布式的用于协调的服务,起源于Hadoop中的一个组件.分布式系统可以用zookeeper实 ...

  2. Linux网络编程系列-TCP编程实例

    实例: client #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #inc ...

  3. Sizeof的计算看内存分配

    本文记录了有关sizeof的一些计算,主要有下面的四种情况:(如有错误,敬请留言) 使用sizeof()计算普通变量所占用的内存空间 sizeof计算类对象所占用空间的大小-用到了字节对齐 sixeo ...

  4. Atom

    http://blog.csdn.net/crper/article/details/45647459

  5. splice slice

    array的方法中,有这么两个方法, 很久之前接触flex的时候就知道了. 可是总是记不太清. splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目 slice() 方法可从已有的数 ...

  6. Atitit  DbServiceV4qb9 数据库查询类库v4 新特性

    Atitit  DbServiceV4qb9 数据库查询类库v4 新特性     V4新特性 安全特性,屏蔽了executeUpdate,使用v2版 Sql异常转换,特别转换了DuplicateEnt ...

  7. atitit 业务 触发器原理. 与事件原理 docx

    atitit 业务 触发器原理. 与事件原理 docx 1.1. 呵呵,你需要需要一个业务 触发器..1 1.2. 触发器/事件/中断的原理1 1.3. Io 硬件中断的原理( 中断的低层有cpu轮询 ...

  8. javascript闭包学习例子

    javascript中的闭包个很让人头疼的概念.总结一下 闭包是指有权访问一个函数作用域中的变量的函数.创建闭包最常见的方式,是在一个函数内部创建另一个函数,用return返回出去. 使用闭包可能造成 ...

  9. gradle.properties

    gradle.properties # If this is set, then multiple APK files will be generated: One per native platfo ...

  10. 史上最全github使用方法:github入门到精通

    [初识Github]首先让我们大家一起喊一句“Hello Github”.YEAH!就是这样. 原文 http://www.eoeandroid.com/thread-274556-1-1.htmlG ...