《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]相等 但是已经超出了数组的长度

  

  今天就到这里,明天继续,加油!

你可能感兴趣的:(指针)