指针与数组

来源:互联网 发布:阿里云空间怎么样 编辑:程序博客网 时间:2024/06/03 15:36

总结:一个指针变量,用数组方式访问指针所指向的数值时,可以把数组下表的形式转化成指针的形式,转化完成后,如果地址有效,则用数组的方式访问指针所指向的数值是合法的。例如,

           struct S

          {

             int a,

             int b,

           }s;

           int *p=&s.a;//p指向了s.a

           p[0]=1;

           p[1]=2;

上述操作中p[0]可以转化成*p实际上就是对a赋值,p[1]可以转化成*(p 1)实际上对b赋值

指针和数组的关系指针和数组的关系指针和数组的关系指针和数组的关系指针和数组的关系指针和数组的关系

1)指针和数组的关系

    对于一个一维数组,例如int a[10],那么a代表的是数组的首地址,它和&a[0]是等价的。

    定义指针int *pp=a等价于p=&a[0];

    如果 p指向a[0],那么*p就是 a[0] 中的元素,p i是数组元素 a[i] 的地址,*(p i)就是数组元素 a[i] 的内容。

    指针和数组的关系指向数组的指针变量也可以带下标,如p[i] *(p i) 等价的。指针和数组的关系

    对数组元素的a[i]的引用页可以写成 *(a i) 的形式,在计算数组元素a[i]的值时,实际上是先将其转换成*(a i)的形式,然后再进行求值,因此在程序中这两种应用时等价的。所以&a[i]a i的含义是等价的,此时可以把数组名看成是一个指向数组的指针,进行操作,但是还有一些不同。

    指针和数组的关系相应的再进行指针运算的时候,如p是一个指针,那么在表达式中也可以在它的下面加下标。P[i]  *(p i) 是等价的,那么此时可以把一个指针看成时一个数组进行操作。例如在定义一个字符指针时:指针和数组的关系

   代码:main()

{

char *string="i love china";

printf("%s \n",string);

 

printf("%c  --  %c",*(string 2),string[2]);

}

输出结果;

 指针和数组的关系

 

由此可以看出指针和数组的密切关系。自己一定要多加理解,再深入研究和应用。

数组名和指针虽然在功能上相近,但还是有区别的,数组名和指针之间有一个不同之处。指针式一个变量所以可以进行赋值和自加自减的操作,语句p=a p 都是合法的,但是不能对数组名进行此类操作。

指针和数组之间的关系:

指针的基本思想是以地址代实物,以小管大,以简代繁,其本质是包含某个变量地址的一个变量。而数组名代表的是一个物理地址,数组下标是逻辑地址,从而决定了这两者之间有密切联系,主要有如下两点:

任何可以由数组实现的*作也能由指针实现。这是因为指针和数组名都是地址,任一数组元素均可由指针表示

在使用形式上,指针的使用亦可采用数组的表示法,以获得好的可读性。指针的可读性要比指针要强。

指针与数组作为两种不同的数据类型,必然有其区别,主要有如下五点:

数组具有静态特征,而指针有更多的动态特性和灵活性。数组一经定义,其基址和大小便固定了,在该数组的有效使用范围内是不可变的;但是指针则具有很强的动态特征,可以动态地指向任一该类型(定义决定)变量,这也就决定了它有更大的灵活性。

指针是变量,可以被赋值,数组名不是变量,不可以被赋值。

指针作为地址可以参加一些地址运算,如加法、减法,在特定的环境下(如两指针指向同一数组中的元素)还可进行比较运算,但不同的数组名之间则一般不进行比较运算。

运算速度上的差异。一般来说,用指针要快些,因为在实际的运算中,总是把数组下标表示通过存储映象函数转换为指针表示,按其地址访问内存,这种转换要进行乘法和加法的运算。

数组具有较好的可读性,指针具有更强的灵活性。一般,对某些多维数组中非连续的元素的随机访问用下标表示比较方便,当按递增(减)顺序访问数组时,使用指针快捷而且方便。

(二)指针与一维数组

    理解指针与一维数组的关系,首先要了解在编译系统中,一维数组的存储组织形式和对数组元素的访问方法。

     一维数组是一个线形表,它被存放在一片连续的内存单元中。C语言对数组的访问是通过数组名(数组的起始地址)加上相对于起始地址的相对量(由下标变量给出),得到要访问的数组元素的单元地址,然后再对计算出的单元地址的内容进行访问。指针和数组的关系指针和数组的关系通常把数据类型所占单元的字节个数称为扩大因子。

 实际上编译系统将数组元素的形式a[i]转换成*(ai),然后才进行运算。对于一般数组元素的形式:<数组名>[<下标表达式>],编译程序将其转换成:*(<数组名><下标表达式>)其中下标表达式为:下标表达式*扩大因子。整个式子计算结果是一个内存地址,最后的结果为:*<地址>=<地址所对应单元的地址的内容>。由此可见,C语言对数组的处理,实际上是转换成指针地址的运算。指针和数组的关系指针和数组的关系

 数组与指针暗中结合在一起。因此,任何能由下标完成的操作,都可以用指针来实现,一个不带下标的数组名就是一个指向该数组的指针。

原创粉丝点击