OC基础11:基本的C语言特性2

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作为预处理过程,在编译前就已经替换完成了;

时间: 2024-10-15 21:44:40

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

Java基础学习(一)——语言特性及开发环境搭建

学习了一段时间的Java,想通过几篇文章做一下这一段时间的学习总结.由于有c/c++的一些基础,总的来说Java语言还是挺具有亲和感的.虽然经常到博客园找资料,但是也一直没有自己动手写过博客,现在练练手,也为日后有个回忆吧. 一,Java简介 1.语言起源 语言起源:Java是SUN ( Stanford University Network 斯坦福大学网络公司 ) 1995年推出的一门高级编程语言.Java名称的来源Java最初被命名为Oak,目标在于家用电器等小型系统的编程语言,随着市场的变

【转】浅思OC的语言特性

算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).整体来说,确实是一门不错的编程语言. 现在,让我来想想OC的动态语言特性.OC的动态特性表现为了三个方面:动态类型.动态绑定.动态加载.之所以叫做动态,是因为必须到运行时(run time)才会做一些事情. (1)动态类型 动态

OC基础 类的三大特性

OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属性和方法不能被父类使用. (3)子类独有的属性和方法,不能够在子类之间互相使用. (4)子类能够重写父类的方法,子类调用该方法时:首先调用子类的方法,如果子类没有该方法,就调用父类的该方法. (5)子类对象指针可以转换成父类对象指针,但是父类对象指针不能够转换成子类对象指针. 三种权限变量的继承:

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

[.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承.多态. 1.封装概念 封装:每个对象都包含有它能进行操作的所有信息,这个特性称为封装.这样的方法包含在类中,通过类的实例来实现. 2.封装的优点 A.良好的封装能够减少耦合(比如实现界面和逻辑分离) B.可以让类对外接口不变,内部可以实现自由的修改 C.类具有清晰的对外接口,使用者只需调用,无需关心

python基础python语言特性

Python的语言特性 Python是一门具有强类型(即变量类型是强制要求的).动态性.隐式类型(不需要做变量声明).大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言. 它能做的事情很多: 1)网站后端程序员:使用它单间网站,后台服务比较容易维护.如:Gmail.Youtube.知乎.豆瓣 2)自动化运维:自动化处理大量的运维任务 3)数据分析师:快速开发快速验证,分析数据得到结果 4)游戏开发者:一般是作为游戏脚本内嵌在游戏中 5)自动化测试:编写为简单

oc基础知识(转)

1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch框架 3.Xcode使用 -------------------- CocoaTouch Media Core Services Core OS -------------------- System Framework OC的类声明,定义域 OC关键字定义为  @class O-C特有的语句for(..in ..)迭代循环,其他的条件和循环语句和c一样 OC对面向对象的概述 (1)

OC基础01

搜索 "==>" 寻找标记 OC基础总结: Objective-C具有相当多的动态特征,如: " 动态类型 , 动态绑定 , 动态加载" ==> copy mutableCopy 浅复制: 在复制操作中,对于被复制的对象的每一层复制都是指针复制. 深复制: 在复制操作中,对于被复制的对象至少有一层是对象复制 完全复制: 在复制操作中,对于被复制的对象的每一层都是对象复制. 一般来讲: 浅复制复制引用对象的指针 深复制 复制引用对象的内容 retain &

oc基础第一天

一 . 基础oc语法 1. 源文件后缀名 C程序的源文件的后缀名为.c OC程序的源文件的后缀名为.m   message. 消息机制. OC是完全兼容C语言的. 所以在.m文件之中是可以写任意的C代码的 .m文件中. 可以写OC代码.C代码.C++代码. 2. main函数仍然是OC程序的入口和出口. 返回值代表程序的结束状态. 参数可以接收用户的数据. 也可以不带参数. 3. #import指令. 1). 这是1个预处理指令. 会在编译之前执行. 2). 作用: 是#inlcude指令的增强

理解Javascript的动态语言特性

原文:理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行:javascript提供eval()函数,用于动态解释一段文本,并在当前上下文环境中执行. 首先我们需要理解的是eval()方法它有全局闭包和当前函数的闭包,比如如下代码,大家认为会输出什么呢? var i = 100; function myFunc() { var i = 'test'; eval('i = "hello."