`
webcenterol
  • 浏览: 915642 次
文章分类
社区版块
存档分类
最新评论

(5)让你不再害怕指针--数组和指针的关系

 
阅读更多

数组的数组名其实可以看作一个指针。看下例:

例九:



上例中,一般而言数组名array 代表数组本身,类型是int[10],但如果把array 看做指针的话,它指向数组的第0 个单元,类型是int* ,所指向的类型是数组单元的类型即int。因此*array 等于0 就一点也不奇怪了。同理,array+3 是一个指向数组第3 个单元的指针,所以*(array+3)等于3。其它依此类推。

例十:


上例中,str 是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str 当作一个指针的话,它指向数组的第0 号单元,它的类型是char **,它指向的类型是char *。

*str 也是一个指针,它的类型是char *,它所指向的类型是char,它指向的地址是字符串"Hello,thisisasample!"的第一个字符的地址,即'H'的地址。注意:字符串相当于是一个数组,在内存中以数组的形式储存,只不过字符串是一个数组常量,内容不可改变,且只能是右值.如果看成指针的话,他即是常量指针,也是指针常量.

str+1 也是一个指针,它指向数组的第1 号单元,它的类型是char**,它指向的类型是char*。

*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,goodmorning."的第一个字符'H'

下面总结一下数组的数组名(数组中储存的也是数组)的问题:

声明了一个数组TYPE array[n],则数组名称array 就有了两重含义:

第一,它代表整个数组,它的类型是TYPE[n];
第二,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0 号单元,该指针自己占有单独的内存区,注意它和数组第0 号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。

在不同的表达式中数组名array 可以扮演不同的角色。

在表达式sizeof(array)中,数组名array 代表数组本身,故这时sizeof 函数测出的是整个数组的大小。

在表达式*array 中,array 扮演的是指针,因此这个表达式的结果就是数组第0 号单元的值。sizeof(*array)测出的是数组单元的大小。

表达式array+n(其中n=0,1,2,.....)中,array 扮演的是指针,故array+n 的结果是一个指针,它的类型是TYPE *,它指向的类型是TYPE,它指向数组第n 号单元。故sizeof(array+n)测出的是指针类型的大小。在32 位程序中结果是4

例十一:



上例中ptr 是一个指针,它的类型是int(*)[10],他指向的类型是int[10] ,我们用整个数组的首地址来初始化它。在语句ptr=&array中,array 代表数组本身。

本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?
答案是前者。例如:

int(*ptr)[10];
则在32 位程序中,有:
sizeof(int(*)[10])==4
sizeof(int[10])==40
sizeof(ptr)==4

实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。




分享到:
评论

相关推荐

    让你不再害怕指针.pdf

    详细讲解指针相关知识,理解的很到位,我看了之后,对指针有了彻底的了解

    让你不再害怕指针(c的精髓)

    详细的介绍了C的主流技术指针,还有相关的指针数组,数组指针,函数指针等等

    c/c++:让你不再害怕指针

    详细讲解指针的种种,看完受益匪浅. 看完之后你会发觉指针的指针都不再是问题,你会发现数组指针不再是问题。你不懂什么,它讲什么。

    指针经验总结

    PDF格式 让你不再害怕指针 <br>前言:复杂类型说明 1、细说指针 1.指针的类型 2.指针所指向的类型 3.指针的值----或者叫指针所指向的内存区或地址 4指针本身所占据的内存区 2、指针的...

    不再害怕指针.zip

    细说指针 指针的算术运算 运算符 指针表达式 数组和指针 ...

    C语言 你不再害怕指针

    C语言的指针和数组绝对是经典,也是关键点。本书介绍指针内容,搞定了指针,你才算懂得了C语言。加油啊

    指针经验总结(非常经典)

    经典的指针详细总结, 让你不再害怕指针,介绍了指针与数组、结构类型、函数等的关系, 指针安全问题,指针的基本运算...

    C、C++指针经验总结

    C、C++指针经验总结,让你不再害怕指针。 1、细说指针。2、指针的算术运算。3、指针表达式。4、指针和数组的关系。5、指针和结构类型的关系。6、指针和函数的关系。7、指针类型转换。8、指针的安全问题。

    一文让你不再害怕指针之C指针详解(经典,非常详细)

    要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以...

    leetcode怎么判断指针为空-Homework:在家工作

    主要思路:结合题目的特点,nums1后面会有多余的空间,不用害怕被覆盖,因此可以考虑从后往前覆盖,只是需要存储更大的值(适用于更苛刻的要求,不让开辟新空间) 主题处理流程和解法1类似 时间复杂度:O(N),空间...

    C语言入门经典(第4版)--源代码及课后练习答案

    7.5.2 使用指针数组 269 7.6 设计程序 280 7.6.1 问题 280 7.6.2 分析 281 7.6.3 解决方案 281 7.7 小结 291 7.8 习题 291 第8章 程序的结构 293 8.1 程序的结构 293 8.1.1 变量的作用域和生存期 294 ...

Global site tag (gtag.js) - Google Analytics