《c和指针》笔记6
一维数组
首先是对于声明的变量的解释,代码如下:
int a; int b[10];
a是一个标量(原先我也是不晓得为什么叫做标量),因为a是一个单一的值,b是数组,是一些值的集合。数组名是一个指向该数组内第一个元素类型的指针,但是数组跟指针是存在一些区别的。
1、数组是能确数量的元素。
2、数组名是常量指针,而指针是一个标量。
*在作为sizeof操作符和&操作符的操作数时,数组名不用指针常量来表示。
1 int a[10]; 2 int b[10]; 3 int *c; 4 ... 5 c = &a[0]; 6 b = a; 7 a = c;
第5行是合法的,c为指向数组a第一个元素的指针,前面我们说到数组名是指向数组内第一个元素的常量指针,因此表达式等于c = a.
第6行是非法的,因为我们不能直接将一个数组的所有元素复制给另一个数组,必须通过循环对于数组内的元素一个个复制。
第7也是非法的,因为数组名在表达式中是一个常量指针,常量是不能能被修改的。
下标引用
*(a + 3)
该表达式的结果相当于a[3]。因为a的值是指向整型的指针,对a进行加法运算的结果是a所指向的数组的第一个元素向后移动3个整型长度的位置。
因此我们可以的得出array[subscript] = *(a + (subscript))。以下有个例子来说明:
int array[10]; int *ap = array + 2; ap == &array[2];//从初始化得出ap是指向数组向后移动2个整型长度的位置 *ap == *(array + 2) == array[2]; ap[0] == *(ap + 0) == array[2]//从上一个表达式我们可以推导出来 ap + 6 == array + 8 == &array[8]//因为ap原本就是指向数组内第3个元素的位置,因此向后移动6个整型长度的位置便是第9个元素的位置 *ap + 6 == array[2] + 6//这里要注意,因为运算顺序是从右往左的也就是6加上ap间接取址后的值 *(ap + 6) == array[8]//不解释 ap[6] == *(ap + 6) == &array[8]//从ap[0]我们可以推导出 &ap//array没有与之相等的表达式,因为我们不能确定ap相对于array处于何种位置 ap[-1] == *(ap - 1) == array + (2 - 1) == &array[1] ap[9]//按照运算的出应该与array[11]相等 但是已经超出了数组的长度
今天就到这里,明天继续,加油!