Chinaunix首页 | 论坛 | 博客
  • 博客访问: 239227
  • 博文数量: 108
  • 博客积分: 3092
  • 博客等级: 中校
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-25 16:35
文章分类

全部博文(108)

文章存档

2011年(3)

2010年(43)

2009年(19)

2008年(43)

我的朋友

分类: C/C++

2008-12-19 20:04:42

数组
1.数组名的值是一个指针常量,因为程序完成链接之后,内存中数组的位置是固定的。
 
2.下标引用和间接访问的等价性(any condition)
array[sub] = *(array + sub)----------总是可以这样代换
2[array]这个表达式依然是合法的,因为它被编译器解释为*(array+2)
 
3.数组与指针
int *a[5];
int *b;
声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,声明一个指针变量时,编译器只为指针本身保留内存空间,因此*a是完全合法的,而*b则是不合法的。另外b++是合法的,a++不行。
 
4.当指针作为函数参数时,根据“传值法则”,无论函数对参数指针做任何修改,指针实参本身都不会改变,但是它所指的内容却可能发生改变。
 
5.char message1[] = "hello";
  char *message2 = "hello";
  前者初始化一个字符数组的元素,而并不是一个字符串常量,后者才是。
 
6.二维数组
int matrix[m][n];
matrix: 指向包含n个整型元素的数组的指针,是一个指向一维数组的指针 int (*p)[n]
matrix+1:指针所指向的单元是一个数组,所以加1操作的结果是,指向下一个一维数组,即“下一行”
*(matrix+1)<=>matrix[1]:指向一维数组第一个元素的指针,是一个指向整型的指针,int *p
*(matrix+1)+5:5将根据整型的长度进行调整,整个表达式的结果是一个指向整型的指针
 
7.int vec[10]; --------------------------(1)
  int matrix[3][10];---------------------(2)
  当(1)作为函数参数时,函数原型可以是:
  void func1(int *vec);
  void func1(int vec[]);
  当(2)作为函数参数时,函数原型则是:
  void func2(int (*mat)[10]); (mat的下标将根据整型数组的长度进行调整)
  void func2(int mat[][10]);  (mat的下标将根据整型的长度进行调整)
8.int *p1[10];
  int (*p2)[10];
  因为下标引用的优先级高于间接访问,所以p1是个数组(指针数组),而p2是一个指向数组的指针。
 
9.char const *keyword[]= {"do","for","while"}----------------(1)
  char const keyword[][6] = {"do","for","while"}-------------(2)
  (1)创建了一个指针数组,每个指针的长度为4,所以sizeof(keyword[1])=4
  (2)创建了一个矩阵3*6,sizeof(keyword[1])=6
 
10.数组名的值是指向数组第一个元素的指针,这个规则只有两个例外,sizeof返回的是整个数组所占用的字节而不是一个指针所占用的字节,单目操作符&返回一个指向数组的指针,而不是一个指向指针的指针,即:
int a[20]={1,2,3};
假设a=100,那么&a=100
 
 
 
阅读(668) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~