《C Primer Plus笔记》数组

一、数组初始化:一维数组初始化:一般形式:  类型名 数组名[数组长度] = {初值表};例如:  int a [5] = {1, 2, 3, 4, 5};1、当使用空的方括号对列表进行初始化时,编译器会根据列表中的数值数目来确定数目大小例如:  int a [ ] = {1, 2, 3, 4, 5};等价于 int a [5] = {1, 2, 3, 4, 5};2、当数值数目...
摘要由CSDN通过智能技术生成

一、数组初始化

一维数组初始化:
一般形式:
  类型名 数组名[数组长度] = {初值表};
例如:
  int a [5] = {1, 2, 3, 4, 5};
1、当使用空的方括号对列表进行初始化时,编译器会根据列表中的数值数目来确定数目大小
例如:
  int a [ ] = {1, 2, 3, 4, 5};等价于 int a [5] = {1, 2, 3, 4, 5};
2、当数值数目多于数组元素数目时,多与的数组元素会被初始化为0
  int a [5] = {1, 2, 3}; a[3] = 0 a[4] = 0
  
二维数组初始化:

  1. int a[2][3] = {{5, 6}, {7, 8}};
560
780
  1. int a[2][3] = {5, 6, 7, 8};
567
800

二、数组与指针

一维数组与指针:
以int a [5] = {1, 2, 3, 4, 5};为例

  1. 数组名代表首位元素地址 a == &a[0];

  2. a + 1; 代表什么?
    首先确定a+1是地址,是指向下一个元素的地址,即a + 1 == &a[1];

  3. * a + 1* (a + 1) 的区别  
    首先已知间接运算符*的优先级大于加号运算符+
    *a + 1 先算 * a,取出a所指向地址(首元素)的值a[0] ==1; 接着加1,最后结果为2;
    *(a + 1) 先算括号里面的 a + 1,

  4. total +=* a++ ;total += *++a;区别

    • * a++一元运算符* 与++的优先级相同,但结合律是从右往左,所以a++先求值,然后才是* a ,也就是说,指针a先递增后指向(先把指针指向位置上的值加到total上,然后再递增指针);total +=* a++;等价于total = *a; a = a + 1;
    • total += *++a;等价于 a = a + 1; total = *a;
    • 注:C语言i++和++i的区别和指针*(a++)和*(++a)的区别
  5. int a[3] = {1, 2, 3}; int *p =a;
    *(a+i) == * (p + i) == a[i] == p[i]

二维数组与指针:
  以int a [2] [3] = {{5, 6, 0}, {7, 8, 0}}; 为例,a数组是一个包含两个数组元素的数组,每个数组元素里面又包含3个int类型的元素。
简写为int a [2] [3] = { a[0], a[1] }; 其中a[0] = {5, 6, 0}; a[1] = {7, 8, 0};看成为一维数组

  1. 区别 a 与 a[0]

    • 数组a是数组首元素地址,在本例中a是一个占用三个int类型大小对象的地址,而a[0]是一个占用三个int大小对象的地址,所以a == a[0] == &a[0][0];
  2. 区别a + 1;与a[0] + 1

    • a是首元素地址,a+1是二维数组的第二个元素 {7, 8, 0} 的地址.
      a + 1== a [1] == &a[1][0];
    • a[0]是数组 {5, 6, 0} 首个元素5的的地址,a[0] + 1指向数组 {5, 6, 0} 里面下一个元素6的地址。即a[0] + 1 == &a[0][1];
  3. *a、**a、*a[0]、

    • int a [2] [3] = { a[0], a[1] }; 其中a[0] = {5, 6, 0}; a[1] = {7, 8, 0};
      a是a[0]的地址,*a == a[0]
    • a[0]是数组 {5, 6, 0}中元素5的地址,*a[0] == 5; 即 **a == *a[0] == 5;

指向二维数组的指针如何表示?
  在前面已经知道指向一维数组的指针可以表示为 int *a[2] (a是一个内含2个数组元素的数组,每个元素都指向int类型的指针),这是因为方括号[]的优先级比 * 高,由于方括号[]的优先级高,先与a结合,所以a是一个内含2个元素的数组,然后 * 表示a数组内含两个指针,最后,int表示a数组中的指针都指向int类型的值。
  指向二维数组的指针可以表示为int (*a)[2](a指向一个内含两个int类型值的数组),根据优先级原则, * 先与a结合,因此声名的是一个指向数组(内含两个int类型的值)的指针。

  1. 如何表示一个二维数组中的元素?
    仍然以 int a [2] [3] = {{5, 6, 0}, {7, 8, 0}}; 为例,要想表示元素7有哪些办法?
    • 数组表示法:a[1][0]
    • 指针表示法:* ( * ( a + 1 ) + 0 ) 即 a [m] [n] = * ( * ( a + m ) + n )

三、变长数组(variable-length array可变长度数组)

定义: 允许使用变量表示数组的长度(C99新增特性)
 例如:
 int a = 4, int b = 2; double sales[a] [b];
缺点:

  1. 必须是自动存储类别,意味着无论在函数中声名还是作为函数参数声明,都不能使用static或extern存储类别说明符;
  2. 声明时不能初始化;

三、变长数组(variable-length array可变长度数组)

指针数组: 数组元素全为指针的数组,其本质是数组。例如int * p[15]
[ ] 的优先级比 * 的优先级高,p先与[]结合,形成数组p[15],有15个元素的数组,再与 * 结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
数组指针: 指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动)例如int (* p)[15]

注:
  1. C规定,数组的维数必须是常量,不能用变量代替!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值