您的位置:首页 > 其它

数组

2016-01-28 12:39 295 查看
数组名的值是一个指针常量。

下标引用

int array[10];
int *ap=array+2;
ap[0]//除了优先级职位,下标引用和间接访问完全相同。ap[0]等价于*(ap+(0))。
ap[6]//等价于 *(ap+6)
ap[-1]//等价于 *(ap-1),也就是array[1]


指针与下标。指针比下标更有效率,

//每一次循环都要做乘法运算:array+a*sizeof(int)
int array[10],a;
for(a=0;a<10;a+=1)
array[a]=0;
//为了对下标表达式求值,编译器在程序中插入指令,取得a的值,并把它与整型的长度相称。这个乘法需要花费一定的时间和空间。


//每次循环都要做的乘法运算:1*sizeof(int)
int array[10],*ap;
for(ap=array;ap<array+10;ap++)
*ap=0;
//这里的重大区别在于:循环每次执行时,执行乘法运算的都是两个相同的数(1和4)。结果。这个乘法只在编译时执行一次——程序现在包含了一条指令,把4与指针相加。程序在运行时并不执行乘法运算。


指针和数组。指针和数组并不是相等的。

int a[5];
int *b;


声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它是一个常量,指向这段空间的起始位置。

声明一个指针变量时,编译器只为指针本身保留内存空间。

字符数组的初始化

char message[]={'H','e','l','l','o',0};
char message[]="Hello";//数组初始化列表的另一种写法
//以上两种初始化方式是等价的

char message[]="Hello";
char *message="Hello";
//前者初始化一个字符数组的元素,而后者则是一个真正的字符串常量。这个指针变量被初始化为指向这个字符串常量的存储位置。


多维数组

int matrix[6][10];
int *mp;
mp=&matrix[3][9];
*++mp;  //matrix[4][0]

int (*p)[10]=matrix;//使p指向拥有10个整型元素的数组的指针。将p与一个整数相加时,该整数相加时,该整数值首先根据10个整型值得长度进行调整,然后再执行加法。


避免 int (*p)[]=matrix;

p仍然是一个指向整型数组的指针,但数组的长度却不见了。当某个整数与这种类型的指针执行指针运算时,它的值将根据空数组的长度进行调整,这是错的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数组 指针