数组
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
阅读(660) | 评论(0) | 转发(0) |