数组

  • 数组名的值是一个指针常量。

  • 下标引用

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仍然是一个指向整型数组的指针,但数组的长度却不见了。当某个整数与这种类型的指针执行指针运算时,它的值将根据空数组的长度进行调整,这是错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值