《C语言教程》09章 数组

[复制链接]
868|5
 楼主| niuyaliang 发表于 2015-3-17 15:49 | 显示全部楼层 |阅读模式
一、数组的定义和赋值

C语言教程中,数组是重点、难点,许多人其实是一知半解,小雅建议还未上路的人,认真阅读本章内容。下面先举例再说明。

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int  i;
  5.     int  iArr[7];
  6.     char cArr[] = {'Q','U','A','N','X','U','E'};

  7.     //给iArr数组赋值
  8.     for (i=0; i<7; i++) {
  9.         iArr[i] = (i + 1) * (i + 1);
  10.     }

  11.     //输出iArr的内容
  12.     for (i=0; i<7; i++) printf("  %2d", iArr[i]);
  13.     printf("\n");

  14.     //输出cArr的内容
  15.     for (i=0; i<7; i++) printf("  %2c", cArr[i]);
  16.     printf("\n");

  17.     //输出超出数组范围内容。该行运行时会出错。
  18.     printf("iArr[7]=[%d]    cArr[7]=[%c]\n", iArr[7]);

  19.     return 0;
  20. }

结果如下:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 15:50 | 显示全部楼层
注意以下几点:
1.数组名也是一变量名,定义时须指定类型和长度。
2.长度可以方括号中直接指定,也可以通过赋值来间接指定。
3.数组可以在定义时直接赋值,也可以定义时不赋值,之后再赋值。
4.当使用超出范围的值时,编译不出错,但运行会出错。(上例运行时出错后,选“忽略”后得到的结果)
 楼主| niuyaliang 发表于 2015-3-17 15:52 | 显示全部楼层
二、数组的地址
弄清数组地址对使用数组有很大好处,另外,有的函数的参数是指针(如scanf函数),如果要用数组的某一元素作参数,就必须知道其地址。

  1. #include <stdio.h>

  2. int main(void)
  3. {

  4.     int  i;
  5.     int  iArr[7];
  6.     char cArr[] = {'Q','U','A','N','X','U','E'};

  7.     //输出iArr数组和cArr数组的地址
  8.     printf("iArr=%p, cArr=%p\n\n", iArr, cArr);

  9.     //输出iArr[i]数组和cArr[i]数组的地址
  10.     for (i=0; i<7; i++) {
  11.         printf("iArr[%d]=%p, cArr[%d]=%p\n", i, &iArr[i], i, &cArr[i]);
  12.     }

  13.     return 0;
  14. }

结果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 15:52 | 显示全部楼层
关于数组地址,需要注意一下几点:
1.数组iArr是int类型,所以它的地址是按4字节递增。
2.数组cArr是char类型,所以它的地址是按1字节递增。
3.数组元素的地址是通过数组元素前面加“&”来取得。(如:&iArr[3])
4.数组名单独使用时,代表该数组的首地址。(iArr等同于&iArr[0])(注意:以后使用指针会经常用到这一点)
 楼主| niuyaliang 发表于 2015-3-17 15:57 | 显示全部楼层
三、元素个数与赋值个数不一致时
    当一个数组定义的长度大于赋值的长度时,超出的部分被放弃;当数组定义的长度小于赋值的长度时,不足的部分被自动填上'\0',对于数值类型的变量,实际上就是赋值为0,对于字符类型实际上就是赋值为NULL。

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int i;
  5.     int  iNum[4] = {100, 150};  //后两个被填上0
  6.     char str1[10] = {'q', 'u', 'a', 'n', 'x', 'u', 'e'};
  7.     char str2[6] = "quanxue";

  8.     for (i=0; i<4; i++) {
  9.         printf("%5d", iNum[i]);
  10.     }
  11.     printf("\n%s\n", str1);     //7,8,9三个元素被填上NULL,所以可以用字符串输出
  12.     for (i=0; i<10; i++) {      //故意循环到10, 看看后面是否为“quanxue”
  13.         printf("%c", str2[i]);  //因为'e'和NULL被弃掉,所以不能用字符串输出
  14.     }
  15.     printf("\n");


  16.     return 0;
  17. }

结果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 16:06 | 显示全部楼层
四、二维数组
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int  i, j, k=0;
  5.     int  iArr[4][5];

  6.     //输出iArr[i,j]数组的地址
  7.     for (i=0; i<4; i++) {
  8.         for (j=0; j<5; j++) {
  9.             iArr[i][j] = k++;
  10.             printf("iArr[%d,%d]=%2d  &iArr[%d,%d]=%p\n",
  11.                 i, j, iArr[i][j], i, j, &iArr[i][j]);
  12.         }
  13.         printf("\n");
  14.     }

  15.     return 0;
  16. }

结果如下:

从地址和内容可以看出,二维数组是一维数组的扩充,地址的排列也是顺序下去的。使用时注意2个下标,不要弄错就可以了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部