"OC基础"这个分类的文章是我在自学Stephen G.Kochan的《Objective-C程序设计第6版》过程中的笔记。

19、定义一个int类型的指针:

int count = 10;

int *intPtr;

intPtr = &count;

然后就可以引用这个指针:

x = *intPtr;

带着间接寻址运算符*号才是指针的完整表达形式。

20、&号是取出它标示的变量的地址,*号是把它标示的变量的值当做地址去寻找内容。

注意指针名里面存的是地址。所以用&把某个变量的地址读出来之后,应该是赋给指针的变量名,这时候不能有*号;然后指针的变量名里存有了某个变量的地址,这时候给指针变量名加上*号,加上了寻址功能,那么整个(*指针变量名)就是读取到某个变量的地址里面存储的那个值了。

21、但是可以在定义指针的时候同时给它赋值,那么这时候可以写成:

int *intPtr = &count;

正常情况下,如果是分开写,应该遵循这么个原则:*无&,有&无*

22、指针的值即是它所指向的那个变量的值,所以在19中,其实*intPtr就是count,count就是*intPtr,是同一个地址存储的内容。

23、指针也可以指向结构,假如有某指针XPtr,某结构变量YStruct,YStruct内有一int元素名为z,通过:

XPtr = &YStruct;

定义了(*XPtr)的值,那么访问YStruct内的值z可以表示为:

(*XPrt).z

由于成员点运算符(.)的优先级比间接寻址运算符(*)高,所以要加上括号。而且这个表达式可以表示为:

XPtr->z

注意不要有空格,同时XPtr前没有*

24、如果使用某个指针作为一个函数的参数,那么在调用这个函数的时候,传参传进去的应该是指针的名字里的那个地址,而不应该是整个指针,即是在参数哪里写上指针的名字即可,不用加上星号。比如将19的指针作为某个函数fx(int *ptr)的参数,那么调用方式应该是:

fx( intPtr );

或者:

fx( &count );

传地址进去即可。

25、定义指向数组的指针的时候,不能把指针的类型定义为“数组指针”,而应该把它的类型定义为数组里元素的类型。

26、如果xArr是元素类型为xTpye的数组,而指针xPtr是一个xTpye类型的指针,i和n都是整数常量,则定义数组指针的格式如下:

xType *xPtr;

xPtr = xArr;  //这个语句相当于xPtr = &xArr[0];

可以注意到,第二个语句中xArr前不需要加上&号,因为编译器已经把没有加上下标的数组名看做了数组第一个元素的地址。

那么这时候*xPtr就相当于xArr[0],同时还有以下情况:

*(xPtr + i)相当于xArr[i]

xPtr += n相当于在数组内把指针向后移动n位,指向n位后的那个值。

27、如果将txtPtr定位为某类型的指针,并把它指向这个类型的数组中的某个元素,那么:

++txtPtr会指向数组中的后一个字符,

--txPtr会指向数组中的前一个字符。

其实即是地址的加减,地址加1即是后一位,地址减1即是前一位。

28、可以比较两个指针变量,一般用在比较指向同一个数组的两个指针的大小。这个比较其实就是比较两个地址的前后关系。越大越后。

29、使用数组作为函数的参数,在调用这个函数进行传参的时候,传进去的数组的名称即可,不需要任何修饰,就和指针一样。比如将char xArray[ ]作为某个函数fx(char arr[ ])的参数,那么调用方式应该是:

fx( xArray );

这意味着,在调用函数的时候,传递给函数的其实这个数组的指针。

30、其实char类型的数组的数组名称就是一个char类型的指针,指向数组第一个元素。

31、如果使用字符串作为函数的参数来调用函数,实际上传递的是指向该字符串的指针,所以29的函数fx(char arr[ ])可以用一个字符串作为参数。比如:

fx( “So this is.” );

32、在字符串前加@号,其实是创建了一个常量字符串对象。仅仅使用双引号括起来的只是一个C样式字符串,它们不是对象。

33、如果txtPtr是一个char类型的指针,txt[80]是一个char类型的数组,那么:

txtPtr = “Yes this is”;   //注意,没有&号

会将txtPtr设为指向这个字符串常量的指针,但是txt=“Yes this is”这一种就不合法了。只有在数组初始化的时候,编译器才允许数组这样赋值:

char txt[80] = “Yes this is”;

34、如下的前缀运算:

j = ++i;

相当于:

++i;

j = i;

前缀会导致i先自增,然后再赋值给j;另一种情况:

j = i++;

相当于:

j = i;

++i;

后缀会导致i先赋值给j,然后才自增。这两种情况要区分。

35、两个相同类型的指针相减,得出的结果它们之间相差的元素个数。

36、函数指针的基本模板:

int (*funcPtr) (void);  //表示指针funcPtr指向一个返回值为int并且没有参数的函数

int func(void);       //声明函数

funcPtr = func;      //可以加上&,没有也可

主要注意的是:

(1)、第一个语句中*号和指针两边的括号不能省略,不然编译器会理解为这是一个返回值类型为(int *)的函数;

(2)、在执行第三句之前,第二句必须得先声明;

(3)、第三句在func前可以加&,不加效果也没影响;

(4)、函数指针一般是用在将它作为参数传给其他函数,或者用在存储了很多函数的数组中(分派表),由于函数本身不能保存在数组元素中,所以代替地将函数指针存储进去。

37、main函数的参数列表(int argc, char *argv[])中,argc是从命令行输入的参数个数,argv是一个字符指针数组,包含了arvc个字符指针。

 数组argv中最后一个指针atgv[argc]规定为空。

38、几个事实:

(1)、对象实际上是结构,结构中的成员是实例变量。结构中继承的成员之一是名为isa的保护成员,它是用来确定对象所属的类的;

(2)、对象变量实际上是指针,比如定义Fraction类的对象变量的时候:

Fraction *myFrac;

实际上是定义了一个名为myFrac的指针变量,这个指针的类型是Fraction;

(3)、方法就是函数。编译器会根据类名和方法名的组合给每一个函数分配一个单独的名称;

(4)、id类型是通用指针类型,所以id类型存储的其实是这个对象的地址。由于对象总是携带着isa成员,所以最终编译器可以通过isa成员判断这个对象所属的类。

39、typedef和#define的区别:

(1)、typedef只是为了增加程序可读性而为标识符另起的新名称,所以功能还是完全相同的,只是换了个名字。而#define原本只是为了定义常量,这个关键字执行的只是简单的查找替换;

(2)、typedef是编译过程的一部分,而#define作为预处理过程,在编译前就已经替换完成了;

OC基础11:基本的C语言特性2的更多相关文章

  1. OC基础(11)

    构造方法 自定义构造方法 继承中的自定义构造方法 自定义类工厂方法 *:first-child { margin-top: 0 !important; } body > *:last-child ...

  2. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  3. OC基础10:基本的C语言特性1

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.  函数和方法的区别? (1).方法包 ...

  4. 【转】浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  5. iOS 阶段学习第11天笔记(OC基础知识)

    iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import  用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...

  6. 浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  7. [.net 面向对象编程基础] (11) 面向对象三大特性——封装

    [.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...

  8. OC基础 类的三大特性

    OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...

  9. 3-0 js基础 语言特性及性能优化

    1.语言特性: 内存泄露:内存没有释放,越堆越多. 垃圾回收(生命周期): 1.局部 很短 在局部中当函数完成时.已经释放了.全局变量在页面关闭的时候才被回收. 2.全局 很长 3.闭包.可长可短,只 ...

随机推荐

  1. 在浏览器中输入Google.com并且按下回车之后发生了什么?

    作者: skyline75489  来源: skyline75489的博客  发布时间: 2015-03-26 16:57  阅读: 4163 次  推荐: 23   原文链接   [收藏]      ...

  2. 【Heritrix基础教程之3】Heritrix的基本架构

    Heritrix可分为四大模块: 1.控制器CrawlController 2.待处理的uri列表  Frontier 3.线程池 ToeThread 4.各个步骤的处理器 (1)Pre-fetch ...

  3. Java使用默认浏览器打开指定URL

    直接贴代码: 方法一: Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler http://www.baidu.co ...

  4. eclipse美化,全黑eclipse 保护眼睛

    如标题,闲话不多说.有图说明一切.看看这是你想要的嘛? 教程及资源下载地址: http://download.csdn.net/detail/shoneworn/8326097

  5. 读取本地文件理解FileReader对象的方法和事件以及上传按钮的美化。

    一.FileReader对象 用来把文件读入内存,并且读取文件中的数据.FileReader对象提供了异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据. 浏览器支持情况, ...

  6. Extjs 6 MVC开发模式(二)

    1.Extjs MVC开发模式 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs4.x版本中引入了MVC开发模式,开始将 ...

  7. UVA 12125 March of the Penguins

    题意: 给定一些冰块,每个冰块上有一些企鹅,每个冰块有一个可以跳出的次数限制,每个冰块位于一个坐标,现在每个企鹅跳跃力为d,问所有企鹅能否跳到一点上,如果可以输出所有落脚冰块,如果没有方案就打印-1 ...

  8. sql相关操作

    1.两个不同数据库对应字段相应操作 //操作模版:insert into data2.table2(字段1,字段2,字段) select 字段j,字段k,字段m from data1.table1举例 ...

  9. Jq合成事件绑定

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. java 包之 BeanUtils包的使用

    BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作. 在使用BeanUtils工具包之前我们需要的Jar包有以下几种: (1)   BeanUtils相 ...