• 6. 指针与数组名


    看了文章:http://blog.csdn.net/porscheyin/article/details/3461565

    归纳总结一下:

     (1) 可以将一个T类型数组的名字赋给一个相同类型的指针。 当有语句char ary[100] = {'a', 'b', 'c', 'd','e', 'f'}; char *cp = ary; 后,cp就指向了数组array中的第一个元素。我们可以通过指针来访问数组的元素:printf("%d", *cp); 此语句的作用是打印出cp所指向的元素的值,也就是数组的第一个元素。现在通过cp = &array[3]; 使cp指向数组中的第4个元素,然后我们就可以对它进行各种操作了。

    (2) 当我们声明一个数组时,编译器将根据声明所指定的元素数量及类型为数组保留内存空间,然后再创建数组名,编译器会产生一个符号表,记录数组名和数组的第一个元素的首地址。数组的属性和指针的属性不相同,在声明数组时,同时分配了用于容纳数组元素的空间;而声明一个指针时,只分配了用于容纳指针本身的空间。

    (3) 针进行减法得到的结果指示出两指针所指向元素间的距离,即它们之间相隔几个数组元素。注意:ANSI C标准没有定义两个指针相加的运算,如果两个指针相加,绝大多数编译器会在编译期报错。

    (4)数组名是一个指针常量,即指针自身的值不能被改变。如ia[100], ia + 99是可以的,但ia++是不行的,它的意思是ia = ia +1; 修改了ia的值。

    (5)作为函数参数时, 不管下面哪种声明方式,都会被转换成指针,即ia不再是指针常量了,可以++。

           void array_to_pointer(int *ia){……}  //无需转换

           void array_to_pointer(int ia[ ]){……}  //被转换成*ia

           void array_to_pointer(int ia[100 ]){……}  //被转换成*ia, sizeof(ia) = 4  (int指针, 4字节)

      因此,编译器始终形参把它当作一个指向数组第一个元素(数组长度未知)的指针。使用sizeof(形参数组名)来获得数组的长度时,得到的只是一个指针的大小。

    (6) 二维数组:

          matrix[50][100]

          int (*p) [100] = matrix;  此时的matrix被转换为一个指向数组的指针,对于matrix[n],是matrix数组的第n+1个元素的名字,也就是matrix数组中50个有着100个整型元素的数组之一,所以可以有p = &matrix[n]; p指向了一个数组元素,也就是矩阵中的某一行,matrix[n]本身是一个一维数组的数组名,它会被转换为指向数组第一个元素的指针,因此可以有int *column_p = matrix[n];这个表达式是最常见的也最容易理解。如果对matrix[n]进行sizeof 操作结果是100*sizeof(int); sizeof(matrix)结果是50*100*sizeof (int)

    (7) 指针数组:

         所谓指针数组就是一个数组它的所有元素都是指针,这与普通的数组没什么区别,不过元素是指针罢了。int (*p) [100]; 如果丢掉了括号那就完全改变了意图,从而声明了一个指针数组。

    int *p[100]; p是一个数组名,该数组存放一个int型的指针。

  • 相关阅读:
    oracle中job定时调用存储过程的实例
    oracle recyclebin详解(闪回删除的表)
    启动和禁用约束及删除违反约束的记录
    儒轩画的老鼠
    SQLServer2005重建索引
    [转]你真的了解 console 吗
    [转]C# 理解lock
    [转]大话 程序猿 眼里的 高并发
    莆田系医院名单
    .Net WEB 程序员需要掌握的技能
  • 原文地址:https://www.cnblogs.com/wenshanzh/p/3287947.html
Copyright © 2020-2023  润新知