数组
数组具有一些和指针完全不同的特征。比如,数组具有确定数量的元素,而指针只是一个标量值。编译器会用数组名来记住这些属性。只有当数组名在表达式中使用时,编译器才会为他产生一个指针**常量。**请注意,是指针常量,而不是指针变量,说明这个数组名被当成指针使用的时候是不能修改这个指针的值的。所以,数组名的值是一个指针常量。
只有两种情况下,数组名不用指针常量来表示—————
1)数组名作为sizeof操作符的操作数
2)数组名作为单目操作符&的操作数
关于字符串和字符数组
主要是指针和数组的区别
char *name = “Jerry”;
char name[] = “Jerry”;
前者用char的指针变量引用一个Jerry的地址,后者把Jerry初始化给char数组
前者不可以对字符串进行修改,即不存在name【0】这样的写法,后者可以修改字符串,可以对单个字符修改,比如name【0】 = ‘k’;
多维数组
多维数组可以不标明第一维的数量,但是必须标明第一维后面的数量。
多维数组,就是数组的数组。
二维数组的指针表示方法:
| 表示形式 | 含义|
表示形式 | 含义 |
---|---|
a | 二维数组名,指行,指向a[0]这一行的起始地址 |
a[0],*(a+0),*a | 指列,指向0行0列的元素地址 |
a+1,&a[1] | 指行,第1行的起始地址(行列数从0开始 |
a[1],*(a+1) | 指列,1行0列的地址,就是a[1][0]的地址 |
a[1]+2,*(a+1)+2,&a[1][2] | 指列,1行2列地址 |
*(a[1]+2), ((a+1)+2),a[1][2] | 指列,这是元素值 |
指向行的意思是,它+1加的是行数,从上往下加
指向列的意思是,它+1加的是列数,从左往右加
我们可以发现,在没有&符号的前提下,用下标法和带*号表示的,一定是一个指向列的,他们递增的时候增加的是列数。用数组名表示的,永远都是行数,比如:a+1,表示的是第(a+1)行的首元素地址,指向行, *(a+1)+2,虽然是指向列的,读作第(a+1)行第二列的元素地址, a+1的含义依旧是第(a+1)行。
可能会混肴的是:
&a[1] 和 &a[1][2]
前者一个下标表示第1行的元素地址,是指向行的
后者两个下标表示元素本身的地址
当把多维数组作为函数参数时
首先要区别的概念是
*p 这个叫一维指针,用于一维数组
(*p)【x】这个叫二维指针,指向行,x是一行的个数,用于二维数组,只能指向整个一维数组,不能指向单个元素,比如在一维数组中,用p=a就不行,一维数组的a是指列的,a+1指的是下一个元素,想要指向整个一维数组,就要+&,即p=&a
&号把指向列的转为行
*号把指向行的指向列
所以函数原型就有两种声明方法,一种是对应的数组形式,一种是上面的指针形式