1.数组名就是一个指针常量。
取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量值的指针。
如下面的例子:
- main()
-
{
-
int a[5]={1,2,3,4,5};
-
int *ptr=(int *)(&a+1);
-
-
printf("%d,%d",*(a+1),*(ptr-1));
-
}
其打印输出为
2,52.
若char a[5] = {0, 1, 2, 3, 4};
p = a;
则p[3]即为a[3],用《C和指针》中所解释为C的下标引用和间接访问表达式是一样的(8.1.2 下标引用).
即a[array] 对等为*(a + (array) )
何为间接访问?
通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针(dereferencing the pointer).这个用于执行间接访问的操作符是单目操作符*。(6.4间接访问操作符)
2[array]是否有错呢?
答案是否定的,2[array]的有效性即为*(2 + array),拿上面的数组a为例,2[a]的有效性即为*(2+a),所以2[a]=*(2+a)=2
example:
- #include <stdio.h>
-
-
int main(void)
-
{
-
-
int a[5] = {1,2,3,4,5};
-
int *p = NULL;
-
p = a;
-
printf("*(p+3) = %d\n", *(p+3));
-
printf("p[3] = %d\n", p[0]);
-
printf("4[a] = %d\n", 4[a]);
-
-
return 0;
-
}
3.字符串常量出现于表达式中时,它的值是个指针常量。编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储衣柜指向第一个字符的指针。如下面的例子:
"abc" + 1 = ?
这里的"abc"将作为一个指针常量,而"abc" + 1正是第一个字符的地址+1,那么现在"abc"+1指向字符b的位置, 则*("abc" + 1)的值为'b'.
《C和指针》中说字符串常量的类型是“指向支付的指针”,所以这个间接访问的结果就是它所指向的字符:x.注意表达式的结果并不是整个字符串,而只是它的第1个字符。
4.下标操作符[]的优先级大于间接访问*
阅读(953) | 评论(0) | 转发(0) |