第八章 数组

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
",a[0][0][1][0]);
18 system("PAUSE");
19 return 0;
20 }

运行结果:5

13.当我们声明一个数组时,它同时也分配了一些内存空间,用于容纳数组元素。但是,当我们声明一个指针时,它只分配用于容纳这个指针本身的空间。

14.只要有可能,函数的指针形参都应该声明为const。

原文地址:https://www.cnblogs.com/Mayfly-nymph/p/8362355.html