YYtengjian 2017-05-17 15:19 采纳率: 100%
浏览 833
已采纳

如何理解数组与指针之间的联系?

如何正确的理解数组与指针?它们之间有何联系?
指针(Pointer)就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。那么如何熟练的运用指针?

  • 写回答

1条回答 默认 最新

  • Carrie_zzz 2017-05-17 15:26
    关注

    声明中:当我们声明一个数组时,编译器将根据声明所指定的元素数量及类型为数组保留内存空间,然后再创建数组名,编译器会产生一个符号表,用来记录数组名和它的相关信息,这些信息中包含一个与数组名相关联的值,这个值是刚刚分配的数组的第一个元素的首地址(一个元素可能会占据几个地址,如整型占4个,此处是取起始地址)。现在声明一个数组:int ia[100]; 编译器此时为它分配空间,假设第一个数组元素的地址为0x22ff00;那么编译器会进行类似#define ia 0x22ff00的操作,这里只是模拟,真实情况并非完全一样,我们在编程时无需关注编译器所做的事情,但要知道此时(声明时)数组名只是一个符号,它与数组第一个元素的首地址相关联。注意:数组的属性和指针的属性不相同,在声明数组时,同时分配了用于容纳数组元素的空间;而声明一个指针时,只分配了用于容纳指针本身的空间。
    表达式中:当我们在表达式中使用数组名,如:ia[10] = 25;时,这个名字会被编译器转换为指向数组第一个元素的常量指针(指针本身的值不可变),它的值还是数组的第一个元素的首地址(一个指针常量),编译器的动作类似于int const ia = (void *)0x22ff00; 这里我们应重点关注的是:数组名是一个常量指针(常指针),即指针自身的值不能被改变。如果有类似ia++或ia+=3这类的语句是绝对不对的,会产生编译错误。注意:当数组名作为sizeof操作符的操作数时,返回的是整个数组的长度,也就是数组元素的个数乘以数组元素类型的大小;另外,在对数组名实施&操作时,返回的是一个指向数组的指针,而非具有某个指针常量值的指针(这个问题在后面会详细论述)。
    通过数组名引用数组元素时:在前面讲过的指针算术运算中指针加上一个整型数,结果仍然是指针,并且可以对这个指针直接解引用,不用先把它赋给一个新指针。如int last = *(ia + 99);此时的ia已经是一个常指针了,这个表达式计算出ia所指向元素后面的第99个元素的地址,然后对它解引用得到相应的值。这个表达式等价于int last = ia[99];事实上每当我们采用[ ]的方式引用数组元素时,如:ia[99],在编译器中都会转换成指针形式,也就是
    (ia + 99) (这里ia + 99和&ia[99]的值都为数组最后一个元素的首地址,所以*(ia + 99)和*&ia[99]得到的结果是一样的,较难理解的是*&ia[99],按照优先级和结合性规则,先对ia[99]取地址再解引用,有些编译器见到这种表达式会直接优化成ia[99]。)现在可以看出来在表达式中,指针和数组名的使用可以互换,但唯一要注意的就是:数组名是常指针,不能对它的值进行修改。ia + 99是可以的,但ia++是不行的,它的意思是ia = ia +1;修改了ia的值。
    作为函数参数:先来了解一下函数的实参与形参。实参(argument)是在实际调用时传递给函数的值;形参(parameter)是一个变量,在函数定义或者原型中声明。C语言标准规定作为形参的数组声明转换为指针。在声明函数形参的特定情况下,编译器会把数组形式改写成指向数组第一个元素的指针。所以不管下面哪种声明方式,都会被转换成指针:
    void array_to_pointer(int *ia){……} //无需转换
    void array_to_pointer(int ia[ ]){……} //被转换成*ia
    void array_to_pointer(int ia[100 ]){……} //被转换成*ia
    那么如果有下面的操作
    void array_test(int ia[100])

            http://blog.csdn.net/porscheyin/article/details/3461565他的博客建议你去看一下
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd