OC基础11:基本的C语言特性2
"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的更多相关文章
- OC基础(11)
构造方法 自定义构造方法 继承中的自定义构造方法 自定义类工厂方法 *:first-child { margin-top: 0 !important; } body > *:last-child ...
- OC基础笔记目录
OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...
- OC基础10:基本的C语言特性1
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1. 函数和方法的区别? (1).方法包 ...
- 【转】浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- iOS 阶段学习第11天笔记(OC基础知识)
iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import 用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...
- 浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- [.net 面向对象编程基础] (11) 面向对象三大特性——封装
[.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...
- OC基础 类的三大特性
OC基础 类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...
- 3-0 js基础 语言特性及性能优化
1.语言特性: 内存泄露:内存没有释放,越堆越多. 垃圾回收(生命周期): 1.局部 很短 在局部中当函数完成时.已经释放了.全局变量在页面关闭的时候才被回收. 2.全局 很长 3.闭包.可长可短,只 ...
随机推荐
- sqlite数据库方言配置
1. application.properties配置sqlite数据库 spring.datasource.url = jdbc:sqlite:C:/test/sqlite/DB/sqlite.db ...
- UISearchBar 点击X 按钮收键盘
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;{ NSLog(@"textD ...
- IOS Xmpp的Iq发送和解析之请求讨论组成员
#pragma mark - 获取讨论组成员 - (void)getDiscussionMemberInfoWithSendIq:(discussionModel *)data { NSXMLElem ...
- Android手机APN设置(中国移动 联通3G 电信天翼),解决不能上网的问题
中国移动 第一步,设置CMNET上网 新建APN 1.名称:cmnet 2.APN:cmnet 3.APN类型:default 就仅仅填写上面3个选项,其它都是默认,不用填写. 第二步,设置彩信 新建 ...
- php 中利用json_encode和json_decode传递包括特殊字符的数据
</pre><span style="font-size:24px"></span><pre name="code" ...
- weblogic8.1在myeclipse中启动正常,在单独的weblogic中无法正常启动的解决方案.
应用程序服务器weblogic8.1.5,项目在myeclipse中启动正常,在单独的服务器中启动就报错了.错误如下图: 经过观察,发现在myeclipse中设置了以下的jar包.估计是这个问题引起的 ...
- 杭电 3887 Counting Offspring
根据上篇翻译的文章以及很多个帖子,都讲述了树状数组最基本的功能就是tree[i]保存的是位置i左边小于等于a[i]的数的个数. 这样也就可以解释代码中为什么有f[i]=getsum(sd[i-1])- ...
- C# Socket学习笔记二
小记:昨天咱们已经了解了Socket的通信原理,可是点对点的一次通信并不是我们想要的,那么今天那我们就继续学习异步通信,简单来说就是服务器端和客户端可以进行多次 互发信息的通信而不用担心通道会关闭.在 ...
- mysql 5.7忘记密码处理
vi /etc/my.cnf在[mysqld]下面增加一行skip-grant-tables 重启 /etc/init.d/mysqld restart /usr/local/mysql/bin/m ...
- Ribbon1: 在Office菜单中添加项目
Office菜单就是应用程序窗口左上角的一个小的应用程序按钮,这个按钮被称作Office按钮,包含一些通用的操作或命令,例如打印.保存和发布.定制Office菜单时,其下的命令将影响整个文档,而不是文 ...