int a和int a//blabla { int a和int a = //blabla }解释一下

WWDC14 Session 402 学习笔记 -- Swift
苹果从WWDC Keynote 开场到 这个Session 都一直在提三个词。SAFE/MODERN/POWER,包括Session上面讲解每个feature的时候,都会说这个体现了Swift哪个特性,例如类型推断 就体现了 SAFE 和 Modern 之类的。
Swift这个语言各个方面的东西都不齐全,语法上,文文件上,小区上。所以毫无iOS经验或者iOS初学者,我强烈不建议现在就学习这门语言。
这里举个非常非常坑的例子:
import&Cocoa&&var&a&=&[1,&2,&3]&var&b&=&a[0...2]&var&c&=&a&&a===b&b===c&c===a&
这个东西吧,第一句话是否注释掉结果截然不同。我们日常讨论的问题好多都是去掉了Cocoa 之后是另外一个样子。可见苹果对于这门语言的设计还是不够规范的。故我不推荐新手们浪费时间去学这个东西,以及Swift 就目前来玩是完全无法替代Objective-C的,我们的项目基本上都会或多或少的混入一些C++的内容,例如自己的移动端通用的网络协议、Facebook Pop、OpenCV之类。Swift是无法直接调用C++的,它需要用OC封装好了去调用OC。
在我们开始写正文之前,再啰嗦一句:
注意:这篇文章仅仅是WWDC Session 402 Introduction to Swift的学习笔记,不含任何猜想与揣测。所有代码都是默认有import Cocoa的。
Swift Basic
苹果从WWDC Keynote 开场到 这个Session 都一直在提三个词。SAFE/MODERN/POWER,包括Session上面讲解每个feature的时候,都会说这个体现了Swift哪个特性,例如类型推断 就体现了 SAFE 和 Modern 之类的。经常点题很棒,给好评!
众所周知:程序 = 代码 + 算法 + 数据结构,而代码的基础是组成每一句的变(常)量。
不过在我们在介绍常量之前,先高呼一声:
println(&Hello&World!&)&
变(常)量
Swift 的 变量定义十分简单:
var&lang:&String&=&&Swift&&
我们前面说过Swift是内置类型推断的,所以我们往往可以省略 :String
var&lang&=&&Swift&&
这里有一个和Objective﹣C以及和Swift长得非常像的js之类的语言不同的地方,Swift的变量一旦声明了,就不能修改类型了,上面的例子中lang只能是字符串类型。之后无论如何赋值都不能修改其类型。
所以我们说设置类型是往往可以省略的,但有些地方还是不能省略的。特别是在Collection类型上面,例如一个本来想放NSObject的字典,因为初始化用的字符串,就被推断成了一个完全都是字符串的字典。
还有另外一个比较无厘头的和Objective-C不同的地方,Swift 可以用任意Unicode字符当做变量名,也就是说,中文,图释,都是可以的。
var&????&=&&cat&&var&鼠標&=&&????&&
常量的定义和变量非常相似,将var换成let即可。非常有 Apple Script 范儿,是不是!
字符串的声明我们上面提过了.
注意这里生成的String,并不是NSString。他甚至都不是一个Object,我们可以在def里面看到:
struct&String&{&&&&&init()&}&
String和CFString一样,他是一个Struct! 不过,苹果爸爸非常漂亮的给我们提供了便利的解决方案。String可以和NSString互相替代,而且API通用。
let&components&=&[&~/txx/swift&]&&OutPut:&[~,&txx&,&swift&]&
注意:result中的那个数组,并非是NSArray,而是Array。以及Array和String一样,也是结构体。不过,Array不具有NSArray的API特性。需要显示转换成NSArray才可以调用其方法,这些我们之后再提。
在Swift中,我们可以通过 for in 枚举字符
let&str&=&&swift&&&&for&k&in&str{&&&&&println(k)&}&
这里有个优化,与我们在OC下,用
-&(unichar)characterAtIndex:(NSUInteger)index&
枚举的Char不同,这个是支持 Unicode 的, 也就是中文再也不会被拆成两个字符了。
顺路一说:我们可以通过
let&dog:&Character&=&&????&&
生成一个纯字符类型。
加法:终于摆脱了OC那冗长的扩展 stringByAppendingFormat, 可以直接用+、+=代替了。
转义:也摆脱了OC的stringFromFormat和 c style的 %d %@传值。
let&a&=&3,&b&=&5&let&ab&=&&\(a)&*&\(b)&is&\(a*b)&&
let&a&=&[&a&,&&b&,&&c&]&
不过这里有点小坑,之后会说
通过循环枚举,即
while&flag&{enum(arr)}&for&a&in&arr&{}&for&var&i=1;i&13;++i&{}&for&i&in&1..10&{}&
这里提一个细节:
.. 代表的是半开半闭区间也就是a..b就是[a,b);
...代表一个完全封闭区间也就是a...b就是[a,b];
1. += 操作
var&a&=&[&a&]&a&+=&&b&&a&+=&[&c&,&&d&,&&e&]&
a[0]&=&&f&&a[3..5]&=&[&c&,&&e&]&
第一个操作很容易理解,第二个操作有点变态。因为他不是在 3..5 换成 [&c&, &e&]数组,如果我写成了
a[3..3]&=&[&c&,&&e&]&
你会发现他变成了插入,我猜这地方以后一定要出面试题!
我们可以这么理解这句话,他干的事情是:
1. 把这个区间清空
2. 在区间开始的位置,插入赋值的数组。
这个功能仅在区间状态有效,如果a[3] = [&c&, &e&] 则会报错
NS容器和Swift容器的区别
除了我之前提过的:虽说Array和String相仿,是一个 Struct,NSArray是一个Class,但Array的API与NSArray不能通用,不过可以像C#那样通过as语法显示转换。但这里面有点坑,这个Session也没有说,我们就不提了。
还有两点不同:
1. Swift的Collection可以放入任何东西,即不只是Object,我还可以放入int\double这些类型。而NS系列必须是NSObject的子类
2. Swift的Collection 是 Typed Collections,也就是我们上面说过的类型推断。
如果我们用上面的代码声明了一个数组:
let&a&=&[&a&,&&b&,&&c&]&
那么,a就是一个完全的字符串数组了,不可能再放入其他类型,而NSMutableArray的话,可以放入其他Object。
这里稍微引申一下:
let&a&=&[&a&,&1]&let&a:&Array&=&[&a&,&1]&let&a:&Array&any&&=&[&a&,&1]&
这三种情况,看起来可能 前两种和第三种不同,但实际上是完全不同的:
第一个被推断为了 NSArray,之后不准做增加操作,会提示没有重载 +=运算符;
第二个被推断为了 NSObject[];
第三个被推断为了 Array;
然后还发现了一个Bug
var&a&=&[&a&,&&b&,&1]&a&+=&1&
貌似是 a 变成了 NSString,b还是String。
var&animalLegs&=&[&pig&:&4,&&dog&:4,&&Snake&:0]&
除了常规枚举key去找value以外,Swift还支持枚举元组(tuple)
var&animalLegs&=&[&pig&:&4,&&dog&:4,&&Snake&:0]&for&(animalName,&Legs)&in&animalLegs&{&&blablabla&}&
var&animalLegs&=&[&pig&:&4,&&dog&:4,&&Snake&:0]&animalLegs[&chihuahua&]&=&5&&&animalLegs[&chihuahua&]&=&4&&&
上文中提到,我们在一个 &Stirng, Int& 的字典里面查找信息。但明显遇到了一个问题:Int是一个Value不是引用,也就是不能传回来NSNull之类的东西了。若像NSString的Range一样返回NSNotFound(-1)的话,也不对。毕竟-1以及-~都是我们可能要的数据。所以返回数字不成立。那该怎么办?
对你没看错,我没有打错,标题就是 ? !,这不是三元运算符,也不是not,而是Swift的新用法。据楷雯说,这是从Ruby抄过来的特性。
? 表示的是:Optional。写法如下:
var&possibleValue:&Int?&=&animalLegs[&chihuahua&]&
这样得到的是一个wrapper(注意wrapper的w不发音,读作[?r&p?]),他可以用nil判断了。如下:
if&possibleValue&{&&&println(&Nyan&)&}&else&{&&&println(&&&&&)&}&
不过这个 类似NSNumber 的东西,不能通过intValue之类的途径获得里面的内容,这时 !就出场了。
!的作用就是突破Optional,拿到内部值
if&possibleValue&{&&&let&value&=&possibleValue!&&&println(&Chihuahua&has&\(value)&legs&)&}&else&{&&&println(&&&&&)&}&
不过这里,有个简练的写法,更漂亮优雅。
if&let&value&=&possibleValue&{&&&println(&Chihuahua&has&\(value)&legs&)&}&else&{&&&println(&&&&&)&}&
Control Flow
我上高中的时候,选修课老师提到: 无论多么精致的程序,多么炫酷的算法,全都是由顺序,循环,分支组成的。
顺序循环前面都介绍过了,这里来把分支介绍了。
if&blablabla&{&}&else{&}&
注意:这里的大括号不可以省略。
switch&num&{&case&1:&&&case&2:&&&default:&&&}&
注意:不再需要写break,且default必须有!且必须所有条件都要覆盖到,一般情况下都会有default,但是若在enum中使用,就可以用case搞定了。
对于case来说,不仅可以写 case 1, case 2, 还可以写 case 1, 2, 3, 4, 甚至 case, 1, 2, 3, 4, 7..10。
函数是编程语言必不可少的元素,Swift的函数声明相对于OC也有很多灵活的地方。
先从最基础的函数样式开始说起:
func&printHelloWorld(){&&&println(&Hello&World&)&}&&&printHelloWorld()&
func&printMessage(message:String,&repeat:&Int){&&&for&i&in&1...repeat&&&{&&&&&&&println(message)&&&}&}&&&printMessage(message:&&Hello&World&,&repeat:&2)&printMessage(&Hello&World&,&2)&与OC不同,这里可以预置默认参数&func&printMessage(message:String&=&&Hello&World&,&repeat:&Int&=&1){&&&&&for&i&in&1...repeat&&&&&{&&&&&&&&&println(message)&&&&&}&}&&&printMessage()&printMessage(repeat:&2)&
func&plus(a:&Int,&b:&Int)-&Int&{&&&return&a&+&b&}&&&println(plus(1,&2))&
返回值的写法虽说挺难看的吧,但支持tuple:
func&requst(url:&String)-&(statusCode:&Int,&response:&String)&{&&&&&return&(404,&&Not&Found!&)&}&&&let&(statusCode,&message)&=&requst(&&)&&&println(statusCode)&println(message)&
觉得let (a,b) = function() 丑?没关系,还有更优雅的写法:
func&requst(url:&String)-&(statusCode:&Int,&response:&String)&{&&&&&return&(404,&&Not&Found!&)&}&&&let&result&=&requst(&&)&&&println(result.statusCode)&println(result.response)&
闭包(Closures)
和 js 差不多,直接是:
let&a&=&{&}&
但与js不同的是:他其实是下面代码的缩写
let&a:()-&()&=&{&}&
也就是说,闭包其实是 Swift 的一种类型,写作()-&(),那么他就可以当做 func 的参数嵌套了。写成这样:
func&exec(repeat:&Int,&block:()-&())&{&&&for&i&in&1...repeat{&&&&&&&block()&&&}&}&&&exec(10,&{println(&Hello&World&)})&
Swift 还提出了一个特殊的词汇:Trailing Closures,他的意思是:如果闭包是func的最后一个传参,那么他可以写在外面。如下:
func&exec(repeat:&Int,&block:()-&())&{&&&&&for&i&in&1...repeat{&&&&&&&&&block()&&&&&}&}&&&exec(10){&&&&&println(&Hello&World&)&}&
和Objective-C 不同,Swift的Class,没有头文件。
class&nyan{&&&}&
var&a&=&nyan()&
和Struct不同,只要是Class类型,就是Ref,而不是Value,且我们不用管理内存。也就是说:它是自动内存管理的。
init关键词,和OC一样。不过这块非常像CPP,如下面这东西
class&nyan{&&&&&var&num:&Int&=&1024&&&&&init()&&&&&{&&&&&&&&&num&=&1;&&&&&}&}&&&class&miao:nyan&{&&&&&var&num1:&Int&=&1&&&&&init()&{&&&&&&&&&num1&=&2&&&&&}&}&&&var&a&=&miao()&&&println(a.num)&println(a.num1)&
如果以OC的思维来看,它输出的应该是 1024, 2。因为OC只要没有call super,就是覆盖掉了。
但实际上Swift输出的是 1, 2。倘若,我们在两个init加上打log的话,会发现,子类的init先运行,然后运行父类的。
那么什么时候在子类的init里面call super.init()呢?
显而易见:当在子类里面要调用父类的成员变量时,要先调用super.init()去初始化它,若没有写的话,XCode会报编译错误。
和C# java一样,前面要顶着override关键词。
Swift 拥有两种 Property,一个是Stored Property, 另一个是 Computed Property
Stored&Property&class&nyan{&&&&&var&num&=&3&}&&&var&a&=&nyan()&&&println(a.num)&a.num&=&1&&&println(a.num)&
由于Class是Ref,所以哪怕我们用 let a = nyan(),我们也可以修改a中的内容。只是我们不能修改 a 指向的地址罢了。
注意,如果我没理解错的话:
Class的所有成员变量都是Stored Property,没有private关键词来修饰它的。
Computed Property
顾名思义,Property的值是经过计算而来的。一般常常用在readOnly属性上,和C#一样也是用get set关键词来做。
class&nyan{&&&&&var&num:&Int&&&&&{&&&&&&&&get{&&&&&&&&&return&1024&&&&&}&&&&&}&}&&&var&a&=&nyan()&&&println(a.num)&
如果没有set关键词的时候,get{}可以省略:
class&nyan{&&&&&var&num:&Int&&&&&{&&&&&&return&1024&&&&&}&}&&&var&a&=&nyan()&&&println(a.num)&
如果我没有理解错的话,如果需要set关键词的时候,那就一定要一个 Stored Property。因为没有私有变量&
class&nyan{&&&&&var&fakePrivateNum:&Int&=&1024&&&&&&&var&num:&Int&&&&&{&&&&&set{&&&&&&&&&self.fakePrivateNum&=&newValue&&&&&}&&&&&&&get{&&&&&&&&&return&self.fakePrivateNum&&&&&}&&&&&}&}&&&var&a&=&nyan()&&&println(a.num)&a.num&=&1&&&println(a.num)&
继承修改set / get 的时候要注意,这里和OC还不太一样。如果我这么写了:
class&nyan{&&&&&var&num:&Int&=&1024&}&&&class&miao:nyan&{&&&&&override&var&num:&Int{&&&&&set{&&&&&&&&&num&=&2&*&newValue&&&&&}&&&&&get{&&&&&&&&&return&num&&&&&}&&&&&}&}&&&var&a&=&miao()&&&println(a.num)&a.num&=&1&
编译程序会报错,而且会出现栈溢出,大量递归调用在 return 那一步。正确的写法应该是:
class&nyan{&&&&&var&num:&Int&=&1024&}&&&class&miao:nyan&{&&&&&override&var&num:&Int{&&&&&set{&&&&&&&&&super.num&=&2&*&newValue&&&&&}&&&&&get{&&&&&&&&&return&super.num&&&&&}&&&&&}&}&&&var&a&=&miao()&&&println(a.num)&a.num&=&1&&&println(a.num)&willSet&didSet&
如果我们想监视,StoredProperty的修改,可以这样:
class&nyan{&&&&&var&num:&Int&=&1024&&&&&{&&&&&willSet{&&&&&&&&&println(&newValue:&\(newValue)&&)&&&&&}&&&&&didSet{&&&&&&&&&println(&oldValue:&\(oldValue)&)&&&&&}&&&&&}&}&&&let&a&=&nyan()&a.num&=&1&
OOP这面的东西好乱&信息量好大&..写的也好乱&.
一句话形容它:是一个Value类型的不能继承的Class。
不过注意两点:
1. 虽说不能继承,但是可以实现接口!
2. 虽说和class功能一样,但是他所有method是只读权限,和cpp的const一样..如果想要在其中修改struct的member,就要在前面加上 mutating
struct&nyan{&&&&&var&num:&Int&=&1&&&&&&&func&changeNum(x:Int)&&&&&{&&&&&&&&&if&(x&10)&&&&&&&&&{&&&&&&&&&&&&&num&+=&x&&&&&&&&&}&&&&&}&&&&&&&init()&&&&&{&&&&&&&&&changeNum(11)&&&&&}&}&
这么写直接CE, 要在前方加上 mutating
Enumerations
和 C家族的 Enum 不太一样,和 Java 的比较像。
他可以不包含实际类型,例如:
enum&compassPoint{&&&case&North,&South,&East,&West&}&
在调用的时候,可以 var a = compassPoint.West 当a被推断为 compassPoint 类型的时候,就可以用 a = .East赋值了。
他可以包含多种类型,例如:
enum&TrainStatus{&&&&&case&OnTime&&&&&case&Delayed(Int)&&&&&&&init(){&self&=&OnTime&}&&&&&&&var&description:&String{&&&&&switch&self{&&&&&case&OnTime:&&&&&&&&&return&&On&Time&&&&&&case&Delayed(let&minutes):&&&&&&&&&return&&delayed&by&\(minutes)&minutes&&&&&&&&&&}&&&&&}&}&&&var&status&=&TrainStatus()&println(status.description)&status&=&.Delayed(42)&println(status.description)&
enum 的定义可以内嵌到 class中
Extensions
有点像OC的Category,但是Swift是静态语言,他不再需要msg_send这样的方法来调用method,所以,Extension不能做出来Swift类的method Swizzling。但同时可以扩展的东西不局限在class上了,一切的一切都可以扩展。
extension&Int&{&&&&&func&repetitions(task:()-&())&{&&&&&&&&&for&i&in&0..self&&&&&&&&&{&&&&&&&&&&&&&task()&&&&&&&&&}&&&&&}&}&&&500.repetitions(){&&&&&println(&Hello&)&}&
注意:Int也好,String也好。他们虽说是值类型,但是和C的int还不是一个意思。他是值类型的对象,并不是一个值。正是因为这个特性,我们才可以在Int内部call self,给他写extension。
不用过多解释了和其他语言的一样。
struct&Stack&T&{&&&&&var&elements&=&T[]()&&&&&&&mutating&func&push(element:&T){&&&&&&&&&elements.append(element)&&&&&}&&&&&&&mutating&func&pop()&-&&T&{&&&&&&&&&return&elements.removeLast()&&&&&}&}&&&var&intStack&=&Stack&Int&()&intStack.push(50)&let&lastIn&=&intStack.pop()&
终于写完了三篇笔记。短短50分钟的视频,信息量太大了。开始写的时候觉得这门语言是个坑,但整篇写下来觉得这门语言很优雅。
拥有动态语言的书写风格,静态语言的运行速度,现代语言的特性,传统语言般严谨的oop。
不过相对的,学习成本高多了:
首先,你要理解oop的继承,重载,多态,泛型
其次,你要熟悉动态语言的书写风格,
然后,你要对高级现代工业语言Java/C#的特性有所了解,语法看起来非常不同,其实和C#还真的是蛮像的。
最后,你要熟悉OC以及相关库,毕竟iOS/OSX开发,目前来看离不开OC。
总之,这门语言对于新手来说,门坎太高,但是非常优秀。不愧是LLVM的作者写的语言啊!
CocoaChina是全球最大的苹果开发中文社区,官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及Cocos2d引擎、Cocos Studio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态,微信在手,天下我有!
请搜索微信号“CocoaChina”关注我们!
关注微信 每日推荐
扫一扫 浏览移动版blablabla是什么意思_blablabla在线翻译_blablabla什么意思_blablabla的意思_blablabla的翻译_英语单词大全_911查询
blablabla是什么意思
输入英文单词或中文词语查询其翻译,例如
blablabla是什么意思 blablabla在线翻译 blablabla什么意思 blablabla的意思 blablabla的翻译 blablabla的解释 blablabla的发音 blablabla的同义词
您是不是要找:
blablablablablabla 网络解释1. 關於我& & 最喜歡的電視節目: gtw | 關於我: blablabla . . | 我想要結識的人: smua nya2. 我听的音乐& & 最近观看的电影blabla | 我听的音乐blablabla | 现在最喜欢的音乐专辑blablablablablablabla 网络例句1. & I try not to approach someone with &don't you think YOU should do blablabla? & &&我尽量不与方法&的人你不觉得你应该做的blablabla?2. & I try not to approach someone with &don't you think YOU should do blablabla? & &&我尽量不接近人以&你不觉得你应该做的blablabla?3. As they say, there is no contract without a risk, and long-term cooperation is not built on blablabla. The most important thing is the fast deal and timely delievery. & &没有天衣无缝的合同,也不可以靠吹水来建立长久的合作关系,说再多也没有实在的签单和顺利的交货重要。4. It claim to be on C:\documents and settings\application data\blablabla but, even with the folder application data visible, i cant find the Thunderbird folder with my data to remove. & &它声称自己是在C: \文件和设置\应用数据\ blablabla ,但即使与文件夹的应用数据可见,我cannot找到Thunderbird的文件夹与我的数据删除。5. Oh my god! I never talked with a friend like that.I would say:Hi~ how's going?blablabla..... & &江南,我还是觉得你要到大城市去发展,要不然我们的人才要被埋没了。6. I'm a good example for young people: They see all the time stars, glamour, successful people, music stars, popstars, blablabla on TV. & &对年轻的人来说我是个很好的例子:他们总在电视上见到那些明星们,魅力不凡的成功者,歌星影星等等等等。7. Ok,i admit i write this essay just wanna practice my writen english,which is sth i m lack of.sorry to write a long and blablabla boring artical to kill your guys time.another time apologys. & &如果幸福的定义可以等同于幸福感的话,那我觉得幸福是一种对生活的态度,不管你在人生过程中的哪个状态你都会是幸福的。blablabla是什么意思,blablabla在线翻译,blablabla什么意思,blablabla的意思,blablabla的翻译,blablabla的解释,blablabla的发音,blablabla的同义词,blablabla的反义词,blablabla的例句,blablabla的相关词组,blablabla意思是什么,blablabla怎么翻译,单词blablabla是什么意思常用英语教材考试英语单词大全 (7本教材)
出国英语单词大全 (5本教材)
大学英语单词大全 (13本教材)
高中英语单词大全 (6本教材)
初中英语单词大全 (13本教材)
小学英语单词大全 (33本教材)
别人正在查
911查询 全部查询 网址:
(共20个)占卜求签
(共17个)民俗文化
(共16个)交通出行
(共10个)学习应用
(共26个)休闲娱乐
(共10个)站长工具
(共9个)身体健康
&2016  京ICP备号-6 京公网安备30 您的举报已经提交成功,我们将尽快处理,谢谢!
#include &stdio.h&
void butler(int& a,int b,int c)
int main(void)
这个题目考察的是函数的默认参数问题,迷惑性很强,有点难度。你刚好中了该题的计。
请你将重心放在函数默认参数问题上。
当函数有默认参数...
大家还关注
>buffer)full=1;elseeof=1;}}};templateintoperator==(istream_iterator&p,istream_iterator&q){if(p.eof&&q.eof)return1;if(!p.eof&&!q.eof)return&p==&q; ll(); ll();returnp.eof==q.}templateintoperator!=(istream_iterator&p,istream_iterator&q){return!(p==q);}intmain(){ostream_iteratoroutput(cout,"\n");istream_iteratorinput(cin);istream_iteratore;copy1(input,e,output);system("pause");return0;}istream_iterator类中==和!=重载出了问题,求大神指教,走过路过请高抬贵手解惑,感激不尽。">C++,求指教 #include<ios...
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID625789空间积分0 积分685阅读权限20帖子精华可用积分686 信誉积分136 专家积分100 在线时间252 小时注册时间最后登录
丰衣足食, 积分 685, 距离下一级还需 315 积分
帖子主题精华可用积分686 信誉积分136 专家积分100 在线时间252 小时注册时间最后登录
论坛徽章:0
在看了scutan昨天发表的《关于指针与函数的几点小结》()后,学到了不少东西,但是还是有些地方没搞清楚。再查阅了有关资料以后,经分析得出一些心得,现与大家分享,有写得不对的地方请指正!
一、关于int (*a)[n]
& & 下面一句声明:int b[10]复制代码对于b本身,有两种意思:1、代表整个数组本身,代表b的类型为int [10],如使用sizeof(b)时(值为10);2、代表指针int *,指向b[0],如在指针运算中(int *p=b)。由此,对于int (*a) [n],在涉及到指针运算的环境下,(*a)代表指针int *,指向& & int (*a)[0]。因此在引用(*a)[n]中的值的时候,要用*(*a+i)的方式。我们可以把(*a)看成一个整体,即和b一样,引用数组b[10]中的值时我们用*(b+i),则引用(*a)[n]中的值的时候自然就是*(*a+i)了。这里的(*a)在内存中是一个指针,指向数组的起始单元,而a则是指向(*a)的指针,所以a可以理解为二级指针。
二、int *p、int **pt与int a[n][m]int a[n][m];
int *p;
int **复制代码这三个声明中a是一个二维数组,p和pt分别为int的一级和二级指针。二维数组与二级指针是截然不同的概念,使用对于a[n-1][1]来引用数组元素相当于*(a+(n-1)(m-1)+1),a实际上是一个一级指针。所以用p=a;& &//正确!
pt=a& &//错误!复制代码(这里有一个不明白的地方,为什么用pt=&a也错误呢?请大家指教)
三、int (*a)[n]与int b[n]、int c[n][m]
& & 通过上面的分析,我们直到a是一个指向数组int (*a)[n]的指针因此有:a=&b;& &//正确!
a=&c;& &//正确!复制代码三、关于指针的运算
& &指针的自增(减)运算是非常常见的,那么它们的规则又是什么呢?对于int a[n],a++的结果是令a中的地址向高地址增加(减少)4位(对于32位机);而对于int (*a)[n],a++的结果是令a中的地址向高地址增加(减少)4*n位。两个式子结果的不同缘于它们所指向的类型的不同。对于一个指针,自增(减)运算是地址变化量等于sizeof(Type)。(Type为指针所指向的类型)。因此,直到指针所指向的类型,对于改种指针所指的指针运算的规律也就清楚了。从语法上讲,判断指针所指类型的方法:把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如,& &&&int*& &//指针所指向的类型是int
  char*& &//指针所指向的的类型是char
  int**& &//指针所指向的的类型是int*
  int(*ptr)[3];& &//指针所指向的的类型是int()[3]
  int*(*ptr)[4];& &//指针所指向的的类型是int*()[4]复制代码第一次写那么长的帖子,有什么不妥的地方,请大家指教。共同进步!
参考资料:
& & 作者:scutan
& & 源自CSDN
[ 本帖最后由 ddvv 于
11:47 编辑 ]
(2.4 KB, 下载次数: 28)
05:07 上传
下载次数: 28
想要,和得到之间还有两个字,那就是做到
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
To be 千里马!
UID空间积分3 积分7253阅读权限100帖子精华可用积分7253 信誉积分3133 专家积分79 在线时间8317 小时注册时间最后登录
帖子主题精华可用积分7253 信誉积分3133 专家积分79 在线时间8317 小时注册时间最后登录
认证徽章论坛徽章:28
LZ这么早起来发帖子啊,不错,顶一下,支持原创啊。
[ 本帖最后由 Godbach 于
08:24 编辑 ]
----------
欢迎光临Godbach的博客:
明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
UID7451264空间积分0 积分1470阅读权限30帖子精华可用积分1470 信誉积分102 专家积分130 在线时间1 小时注册时间最后登录
家境小康, 积分 1470, 距离下一级还需 530 积分
帖子主题精华可用积分1470 信誉积分102 专家积分130 在线时间1 小时注册时间最后登录
论坛徽章:0
理解错误的地方太多了
不抛弃,不放弃
UID空间积分0 积分848阅读权限20帖子精华可用积分848 信誉积分335 专家积分5 在线时间256 小时注册时间最后登录
丰衣足食, 积分 848, 距离下一级还需 152 积分
帖子主题精华可用积分848 信誉积分335 专家积分5 在线时间256 小时注册时间最后登录
论坛徽章:0
原帖由 ypxing 于
08:40 发表
理解错误的地方太多了
发现错误给人指出来,才不枉牛人一番
好好学习,天天向上!
UID7451264空间积分0 积分1470阅读权限30帖子精华可用积分1470 信誉积分102 专家积分130 在线时间1 小时注册时间最后登录
家境小康, 积分 1470, 距离下一级还需 530 积分
帖子主题精华可用积分1470 信誉积分102 专家积分130 在线时间1 小时注册时间最后登录
论坛徽章:0
&&int b[10]; 对于b本身,有两种意思:1、代表整个数组本身,代表b的类型为int [10],如使用sizeof(b)时(值为10);
&&使用对于a[n-1][1]来引用数组元素相当于*(a+(n-1)(m-1)+1),a实际上是一个一级指针
&&三、int (*a)[n]与int b[n]、int c[n][m]
&&a=&c;& &//正确!
&&对于int a[n],a++的结果是令a中的地址向高地址增加(减少)4位(对于32位机);
&&int(*ptr)[3];& &//指针所指向的的类型是int()[3]
&&int*(*ptr)[4];& &//指针所指向的的类型是int*()[4]
以上都是不对的
原帖由 ddvv 于
05:02 发表
在看了scutan昨天发表的《关于指针与函数的几点小结》()后,学到了不少东西,但是还是有些地方没搞清楚。再查阅了有关资料以后,经分析得出一些心得,现与大 ...
不抛弃,不放弃
UID206509空间积分0 积分35阅读权限10帖子精华可用积分35 信誉积分106 专家积分0 在线时间4 小时注册时间最后登录
白手起家, 积分 35, 距离下一级还需 165 积分
帖子主题精华可用积分35 信誉积分106 专家积分0 在线时间4 小时注册时间最后登录
论坛徽章:0
这篇帖子容易误导初学者啊,楼主赶快修正错误吧。
为什么不先找个编译器试验一下,看看自己的推断是否正确呢?
在网络世界里痛苦的挣扎着
UID206509空间积分0 积分35阅读权限10帖子精华可用积分35 信誉积分106 专家积分0 在线时间4 小时注册时间最后登录
白手起家, 积分 35, 距离下一级还需 165 积分
帖子主题精华可用积分35 信誉积分106 专家积分0 在线时间4 小时注册时间最后登录
论坛徽章:0
int a[n][m];
p=a;& &//正确!
在网络世界里痛苦的挣扎着
UID7451264空间积分0 积分1470阅读权限30帖子精华可用积分1470 信誉积分102 专家积分130 在线时间1 小时注册时间最后登录
家境小康, 积分 1470, 距离下一级还需 530 积分
帖子主题精华可用积分1470 信誉积分102 专家积分130 在线时间1 小时注册时间最后登录
论坛徽章:0
下面是我写的一篇有关指针和数组的帖子,希望有所帮助
不抛弃,不放弃
UID625789空间积分0 积分685阅读权限20帖子精华可用积分686 信誉积分136 专家积分100 在线时间252 小时注册时间最后登录
丰衣足食, 积分 685, 距离下一级还需 315 积分
帖子主题精华可用积分686 信誉积分136 专家积分100 在线时间252 小时注册时间最后登录
论坛徽章:0
看来考虑了那么久还是不对啊,里面的语句我在xp+gcc下面试过,好像没发现过什么问题。。。 继续学习~
想要,和得到之间还有两个字,那就是做到
UID625789空间积分0 积分685阅读权限20帖子精华可用积分686 信誉积分136 专家积分100 在线时间252 小时注册时间最后登录
丰衣足食, 积分 685, 距离下一级还需 315 积分
帖子主题精华可用积分686 信誉积分136 专家积分100 在线时间252 小时注册时间最后登录
论坛徽章:0
哦,原来我用代码来试的时候,对于二维数组的初始化我用
int a[2][2]={1,2,3,4}而不是{{1,2},{3,4}}
这就引起的误解……
想要,和得到之间还有两个字,那就是做到}

我要回帖

更多关于 int a b 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信