linux 数组和指针

来源:互联网 发布:linux怎么安装语言包 编辑:程序博客网 时间:2024/06/05 17:26
1.数组和指针分别怎么定义?
数组:char a【20】={0};
二维数组:char a【3】【4】={0};
定义数组时,数组的长度是一定值,不能是一个变量,否则无法通过编译。
注意,数组的下标总是从0开始。
 
指针:char *p;
如果p=a;(a是一个字符数组)那就是p指向字符数组a中的字符串,且指向第一个元素。

2.指针和数组有什么联系?
1).当数组出现在一个表达式中时,它和指向数组中第一个元素的指针是等价的。因此数组和指针几乎可以互换使用。另外,使用指针要比使用数组下标快两倍。
2).将数组作为参数传递给函数和将指向数组第一个元素的指针传递给函数是完全等价的。将数组作为参数传递给函数时可以采用值传递和地址传递两种方式,前者需要完整地复制初始数组,但比较安全;后者的速度要快得多。
3).但数组和指针也不是完全等价的。假如在源文件中定义char a【max】;而在头文件中定义extern   char *a;那运行程序时将会出现错误。

3.关于二维数组中的一些问题
定义一个二维数组,char a【3】【4】;则有 a=&a【0】,a【0】=&a【0】【0】,以此类推,可以得到a+1=&a【1】,a【0】+1=&a【0】【1】
总结:二维数组可以看成是由若干个一维数组作为元素的数组,那些一维数组的数组名即为a【0】,a【1】等,他们和a一样也是一个地址,各自首元素的地址。

4.为什么要小心对待位于数组后面的那些元素的地址?
在有些计算机上,地址的分配是以一种称为段地址结构的形式分配的,该地址由两部分组成:第一部分是一个指向某一块内存的起始点的指针(即基地址),第二部分是相对于这块内存的起始点的地址偏移量。假设基地址存放着数组a,因为基地址无法改变,而且地址偏移量也不可能是负的,所以位于a【0】前面的元素就没有意义了,同理,如果数组a放在了这块内存的尾部,那&a【max】(max是数组a的长度)就是没有意义的。

5.指针数组是以什么为结束标志的?
怎样定义一个字符数组?char  *a【20】;
指针数组是以空指针NULL为结束标志的,正如字符串中是以空字符'\0'为结束标志的。

6.指针的运算
当定义一个指向数组的指针时,可以采用p++或者p--(p是指针)的形式,从而遍历整个数组。
当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针,运算出来的值是两个指针在内存中的距离(以数组元素的长度为单位)

7.常量指针和指针常量的区别
常量指针:const char *p  p是一个常量指针,即指向一个常量的指针,该常量不能被改变。
指针常量:char * const p=a p是一个指针常量,即p这个指针本事是一个常量,不可以被修改,但它指向的内容可以被修改。

8.什么是空指针?
在程序中,需要使用一种不指向任何对象的指针,这种指针被称为空指针,空指针的值是NULL。
指针的值不能是一个整型值,但空指针是个例外,即空指针的值可以是一个纯粹的0,在编译时产生的任一一个表达式,只要它是0,就可以作为空指针的值。在程序运行时,最好不要出现一个为0的整型值。NULL不是被定义为0就是被定义为(void*)0。许多函数的返回值是一个指针,当函数调用失败时,返回一个空指针,否则返回一个有效指针。
如果返回值是一个整型值,调用失败时返回一个非0值,否则返回一个0值。

9.指针数组和数组指针
指针数组:元素都为指针的数组。char *a【20】;
数组指针:一个指向一个数组的指针。char (*a)【20】; a指向一个有20个元素的数组。


10.函数指针和指针函数
函数指针:指向函数的指针。int (*p)(int a);定义一个指向返回值为int,参数为int型的指针p。
指针函数:返回值为指针的函数。int * fun (int a);定义一个返回值为int*型,参数为int型的函数。


原创粉丝点击