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. [ACM_几何] Wall

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28417#problem/E 题目大意:依次给n个点围成的一个城堡,在周围建围墙,要求围墙 ...

  2. 身份证号码查询与生成(C#源码)

    项目要用到这个功能,就写了一个,完整类也就二百来行,很简单.可以在项目中用,也可以作为学习. 源码下载 http://yunpan.cn/cmQCSWkhDnZLJ  访问密码 0227 核心代码如下 ...

  3. .NET学习笔记 -- 那堆名词到底是啥(CLR、CLI、CTS、CLS、IL、JIT)

    什么是CLR? CLR,公共语言运行时(Common Language Runtime)是一个由多种语言使用的“运行时”.他的核心功能包括(内存管理.程序集加载.安全性.异常处理和线程同步),可以被面 ...

  4. Effective c#学习笔记(1)

    条款1 使用属性代替可访问的数据成员 属性是个啥,谁在用? 1. C#的属性在被访问的时候看起来好像是数据成员,但其实是方法.     2. 在.NET框架中,一般使用属性表达公有数据成员.      ...

  5. swagger:The World's Most Popular Framework for APIs.

    swagger官网:http://swagger.io/ swagger ui demo:http://petstore.swagger.io 让API文档总是与API定义同步更新,是一件非常有价值的 ...

  6. Memcache服务器端参数说明

    /usr/local/webserver/memcached/bin/memcached -d -m 512 -u root -l 192.168.0.1 -p 11211 -c 512 -P /us ...

  7. Android 使用Font Awesome 显示文字图标

    Android 使用Font Awesome 显示文字图标 简单几步就可以完成 简单的效果图: 1. 创建 assets 文件夹 在Android Studio 上的创建步骤为: 在 src/main ...

  8. JS操作页面

    DOM操作 1 windows对象操作 属性(值或者子对象): opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器打开的,则opener是null.可以利用这属性来关闭源窗口 方法(函数 ...

  9. 据说,每一个 iOSer 都想要一张 Swift 大会门票

    据说,每一个 iOSer 都想要一张中国首届 Swift 开发者大会的门票: 那么,福利来了-- fir.im 作为中国首届 Swift 大会的唯一钻石赞助商,有最后 2 张价值 600 多的门票(已 ...

  10. iOS中app启动闪退的原因

    这种情况应和所谓的内存不足关系不大,很少有程序会在初始化时载入大量内容导致崩溃,并且这类问题也很容易在开发阶段被发现,所以内存不足造成秒退的可能性低(内存不足退,通常是程序用了一段时间,切换了几个画面 ...