C/C++复仇(下)

 

看好书

自从上次写了《C/C++复仇记(下)》以来,我继续看《C语言深度剖析》,理解了几个以前不懂的知识点,例如指针数组,数组指针,函数指针(平时历来不用)等。java

 

我甚至以为C语言是一门很难的语言,以前认为容易,是由于只接触了容易的部分,固然这是相对而言的(python,java等高级语言都没有指针啥的,并且内存管理也轻松不少)。可是C做为咱们大学里面学习的第一门语言,也是面试,笔试,考试,竞赛等等最经常使用到的语言,没有理由很差好学习之。而学习它,更多的是语言实现细节,不只仅是语法细节,而实现细节在语言上的反映就是编译器的作法,好比函数,好比一个malloc函数,理解了它的实现,就能够知道为何申请后要进行转化成特定类型的指针(由于用到了void*指针类型)等等,这些都须要深刻理解,甚至是动手调试。python

C的指针和数组

指针与数组的区别面试

书里面讲的很明白,数组和指针是彻底不一样的东西,相互之间也没有什么关联。只是它们的某些操做方法很类似,因此经常令咱们迷惑。指针是一个地址,指向的是内存中的一块内存,它的类型只是表示它怎么解读内存里面的内容。如int *p = &a[0]; 使得p指向数组的首元素的首地址,而后*(p+1)则表示下一个int型,是跨越了4个字节的(32位机)。固然也能够用下标的方式来访问: p[1],其等价于 *(p+1),这就是迷惑咱们的地方,由于数组也能够这样来访问。数组

 

几个要说明的问题

对指针进行加 1 操做,获得的是下一个元素的地址,而不是直接下一个字节的地址。ide

假设有 int a[10] = {0};函数

数组名a做为右值:学习

int (*p)[10] = &a;   // 将整个数组的首地址赋予数组指针, +1解读为跳10个int类型大小。指针是按照类型来肯定下一个元素的位置的。spa

当 int *p = &a;     // 编译器将会警告,说类型转换,把数组地址赋给了int* p指针

当a做为右值时,和&a[0]是同样的。也就是说能够这样用:调试

int x = *(a+1);      // 表示数组的第二个元素赋值给x

 

区别指针数组和数组的指针:

A),int *p1[10];        // 指针数组 int* p1[10]  ,[]的优先级比*高。

B),int (*p2)[10];        // 数组指针 int (*)[10]  p2, 指向10个元素数组的一个指针

 

 

理解指针和数组,最重要的是理解,指针是一个地址,指向一片内存,怎么解读内存关键在于起始地址和指针类型。而数组则是做为一个总体存在的,能够访问数组内的单个元素,可是其自己能够做为一种类型,能够有指向这种类型的指针。

一种意识

学习一种语言,到了必定的程度,应该养成了察觉错误的意识。错过一次后,找到犯错误的缘由,也就不会错了。而每每咱们犯错误,是由于咱们的认知没有到位,没有搞清各个元素之间的关系。咱们学习同样技能,老是克服原有的思惟方法,从新肯定其表达方式,归根结底都是一种映射,可是这种映射和咱们潜意识中的内容可能有误差,而阅读更多的知识,作更多的练习是减小这种误差的惟一方法。加油!

END

by bibodeng 2013-04-20 16:44:12

相关文章
相关标签/搜索