1.数组名,除了作为sizeof操作符或单目运算符&的操作数时(sizeof返回数组的长度:包括初始化的和未初始化的,而不是指向数组的指针的长度;取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向数组类型的指针的指针),其他情况下,是一个常量指针(不是指针变量),指向数组第一个元素的地址(第一个元素也可以使一个数组),不能作为左值
2.数组可以在定义时直接初始化,或者在定以后逐个初始化,或者用循环来初始化,见给一个数组复制给另一个数组时,不能直接赋值,而应该使用循环逐个初始化
3.除了下标引用优先级高于间接访问,两者完全相同,也就是说对于数组,可以当等的使用下标引用和间接访问,但是下标引用可读性更好,间接访问更有效率
4.C不对数组下标进行检查的原因在于下标引用可以作用于任意的指针,而不仅仅是数组名,作用于指针的下标引用的有效性既依赖于该指针当时恰好指向什么内容,一依赖于下标的值,于是C的下标检查所涉及的开销很大
5.指针的效率:当使用固定的步长在数组中移动时,使用指针变量比使用下标效率更高;如果可以通过测试一些已经初始化并经过调整的内容来判断循环是否应该终止,那么你就不需要使用一个单独的计数器;那么必须在运行时求值的表达式较之在编译时就已经得到的常量表达式代价更高
6.声明一个数组时,编译器将根据声明所指向的元素数量为数组保留内存空间,然后再创建数组名,它的值是一个常量,指向这段空间的起始位置。声明一个指针变量时,编译器只为指针本身保留内存空间,它并不为任何整型值分配内存空间。而且,指针变量并为被初始化为指向任何现有的内存空间,如果它是一个自动变量,它甚至不会被初始化
7.当将数组名作为参数传递给一个函数时,实际上传递的是数组名表示的指向数组第一个元素的地址的指针的拷贝,是值传递的方式,但修改指针所指向地址的内容会修改数组元素的值,属于地址调用
8.函数原型中一维数组形参无需写明它的元素数目的原因是函数并不为数组参数分配内存空间,形参只是一个指针,它指向的是一个已经在其他地方分配好的内存空间,它只是指向数组第一个元素的指针
9.存放于静态内存的数组只初始化一次,由连接器在程序运行前完成,但对于自动变量,程序每次调用该数组时,函数都会用一条隐蔽的复制语句初始化
10.char message1[] = "hello,world";char *message2 = "hello,world";前者为初始化一个字符数组的元素,后者则是一个真正的字符串常量。这个指针变量被初始化为指向这个字符串常量的存储位置。