1.数组名是一个指针常量,类型由数组元素的类型决定只有在两种场合下,数组名并不用指针常量来表示------就是当数组名作为sizeof操作符或单目操作符&的操作数时。前者:返回整个数组的长度,后者: 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向指向某个指针常量值的指针。
const(*号)左边放,我是指针变量指向常量;(常量指针)
const(*号)右边放,我是指针常量指向变量;
const(*号)两边放,我是指针常量指向常量;
指针变量能改指向,指针常量不能转向。
2.
3.
int a[10]; int *p=a+2;
*p相当于a[3]则p[-1]表示p[2](3-1)
2[a]相当于*(2+a)也就是a[2]
4.
int a[5]; int *b;
表达式*a合法,但*b不合法因为*b将访问内存中某个不确定的值,或者导致程序终止。b++可以通过编译,a++不能,因为a的值是一个常量。
5.改变传入的指针,原数组不会影响(例如对传入指针,相当于数组范围变小),但对下标进行操作,原数会改变。函数实际传递的是数组的第一个元素的指针。
6.自动变量位于运行时堆栈中,执行流每次进入它们所在的代码块时,这类变量每次所处内存位置可能不相同。
7.自动计算数组长度。
8.在C中,多维数组的元素储存顺序按照最右的下标率先变化的原则,称为行主序。
9.
int matrix[6][10]
解释为6行10列还是10行6列都可以,只要你每次都坚持用同一种方法。
matrix这个名字的值是一个指向它第一个元素的指针,所以matrix是一个指向一个包含10个整型元素的数组指针。matrix[0][0]~[0][9]
对于二维数组,可以看成两个待存储确定项。matrix[3][10]:*(matrix+1)+2对[3]的位置进行操作,此时为一个指针,再向右偏移2个位置,指向matrix[1][2]。而*(*(matrix+1)+2)就是matrix[1][2]。
10.matrix[4,3]相当于matrix[3]。
11.
int vector[10],*vp=vector; int matrix[3][10],*mp=matrix;
第一个正确,都为指针。
第二个错误,此时matrix为数组了,要想声明就要int (*p)(10)=matrix;此时,p指向matrix的第一行,拥有10个整型元素的数组的指针。
12.
花括号:1.路标的作用,更容易找到正确的位置。
2.如果使用花括号,每个子初始列表都可以省略尾部几个初始值,同时,每一维的初始列表各自都是一个初始化列表。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) 5 { 6 int a[2][2][3][5]={ 7 { 8 { 9 {},{5} 10 }, 11 { 12 {0} 13 } 14 }, 15 {} 16 }; 17 printf("%d\n",a[0][0][1][0]); 18 system("PAUSE"); 19 return 0; 20 }
运行结果:5
13.当我们声明一个数组时,它同时也分配了一些内存空间,用于容纳数组元素。但是,当我们声明一个指针时,它只分配用于容纳这个指针本身的空间。
14.只要有可能,函数的指针形参都应该声明为const。