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. MySQL主键设计

    [TOC] 在项目过程中遇到一个看似极为基础的问题,但是在深入思考后还是引出了不少问题,觉得有必要把这一学习过程进行记录. MySQL主键设计原则 MySQL主键应当是对用户没有意义的. MySQL主 ...

  2. .net版本发展历史

    最近装上了VS2013,发现好多新特性.新功能,公司办公还在使用VS2005.VS2008,不过用着也很顺手,在最新版Visual Studio中,微软加入了git源码管理工具,和之前的TFS大体上类 ...

  3. MyBatis入门学习(三)

    在实际开发中,我们希望文件配置是分类配置存放,需要的时候引入即可.如果多文件的配置混合配置使用,那么对项目的后期维护将增加难度. 一.对于连接数据库的配置单独放在一个properties文件中 1.对 ...

  4. 使用OData技术遇到的问题及解决办法

    “System.NotSupportedException”类型的未经处理的异常在 Microsoft.Data.Services.Client.dll 中发生 其他信息: 对此 POST 请求的响应 ...

  5. 通过 Redis 实现 RPC 远程方法调用(支持多种编程语

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/101.html?1455869487 我发现经常研究并且为之兴奋的一件事就 ...

  6. EF架构~AutoMapper对象映射工具简化了实体赋值的过程

    回到目录 AutoMapper是一个.NET的对象映射工具,一般地,我们进行面向服务的开发时,都会涉及到DTO的概念,即数据传输对象,而为了减少系统的负载,一般我们不会把整个表的字段作为传输的数据,而 ...

  7. svn:previous operation has not finished

    svn提交遇到一个恶心的问题,cleanup也不行. 错误如下: Previous operation has not finished; run 'cleanup' if it was interr ...

  8. struts2学习笔记之九:struts2的命名空间

    struts2的命名空间适用于多人开发,根据不同模块命名不同的命名空间,方便开发和管理 struts2如果没有配置命名空间,默认命名空间为"/",Struts2中Action的完整 ...

  9. token防止表单重复提交

    出现表单重复提交的三种情况: 一.服务器响应缓慢,用户多次点击提交按钮. 二.提交成功后刷新页面. 三.提交成功后返回表单页面再次点击提交. package com.jalja.token; impo ...

  10. angularjs学习曲线

    angularjs学习曲线 刚开始学Augular觉得开发应用需要有相当的编程基础. 不得不说这确实是一款了不起的开发框架,它要求开发人员设计低耦合和可维护的应用. 使用AngularJS 的复杂度就 ...