Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180307
  • 博文数量: 37
  • 博客积分: 1367
  • 博客等级: 中尉
  • 技术积分: 465
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-06 17:41
文章分类

全部博文(37)

文章存档

2015年(1)

2012年(17)

2011年(10)

2010年(1)

2009年(8)

我的朋友

分类: C/C++

2012-02-21 15:02:20

1.数组名就是一个指针常量。
取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量值的指针。
如下面的例子:
  1. main()
  2. {
  3. int a[5]={1,2,3,4,5};
  4. int *ptr=(int *)(&a+1);

  5. printf("%d,%d",*(a+1),*(ptr-1));
  6. }
其打印输出为2,5
2.
若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:
  1. #include <stdio.h>

  2. int main(void)
  3. {

  4.     int a[5] = {1,2,3,4,5};
  5.     int *p = NULL;
  6.     p = a;
  7.     printf("*(p+3) = %d\n", *(p+3));
  8.     printf("p[3] = %d\n", p[0]);
  9.     printf("4[a] = %d\n", 4[a]);
  10.     
  11.     return 0;
  12. }
3.字符串常量出现于表达式中时,它的值是个指针常量。编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储衣柜指向第一个字符的指针。如下面的例子:
"abc" + 1 = ?
这里的"abc"将作为一个指针常量,而"abc" + 1正是第一个字符的地址+1,那么现在"abc"+1指向字符b的位置, 则*("abc" + 1)的值为'b'.
《C和指针》中说字符串常量的类型是“指向支付的指针”,所以这个间接访问的结果就是它所指向的字符:x.注意表达式的结果并不是整个字符串,而只是它的第1个字符。
4.下标操作符[]的优先级大于间接访问*


阅读(953) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~