《C语言教程》17章 数组作参数

[复制链接]
1024|4
 楼主| niuyaliang 发表于 2015-3-17 20:34 | 显示全部楼层 |阅读模式
一、数组作参数后的长度

数组作参数时,其后面的长度毫无意义,应该改成不定义长度的数组。作为参数时,数组将自己降级为指针。下面例子中,sizeof(arr)取到的是arr地址的长度,等于4。而主程序中sizeof(num)应该是12。


  1. #include <stdio.h>

  2. int subFunc(int arr[3]);

  3. int main(void)
  4. {
  5.     int x, len;
  6.     num[] ={10, 20, 30};

  7.     //取数组的长度
  8.     len = sizeof(num) / sizeof(int);
  9.     printf("main中的数组长度:%dn\n", len);

  10.     //让数组的每一个元素加1
  11.     for (i=0; i<len; i++) {
  12.         printf("%3d", ++num[i]);  //++num[i]是先加后显示
  13.     }
  14.     subFunc(num);    //调用子函数

  15.     //再次显示数组内容
  16.     printf("\nmain中的数组:\n");
  17.     for(i=0; i<len; i++) {
  18.         printf("%3d", num[i]);    //只有num[0]发生了改变
  19.     }
  20.     printf("\n");

  21.     return 0;
  22. }

  23. int subFunc(int arr[3])   //将数组改成指针,结果一样    int subFunc(int *arr)
  24. {                         //若用数组也应该不定义长度    int subFunc(int arr[])
  25.     int i, len ;

  26.     //取数组的长度
  27.     len = sizeof(arr) / sizeof(int);
  28.     printf("subFunc中的数组长度:%d\n",len);

  29.     //让数组的每一个元素加1
  30.     for(i=0; i<len; i++) {        //其实并没有循环3次
  31.         printf("%3d", ++arr[i]);  //只循环了1次
  32.     }                             //如果将len改成3,便可以达到预期效果
  33.     printf("\n");

  34.     return ;
  35. }


本帖子中包含更多资源

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

×
 楼主| niuyaliang 发表于 2015-3-17 20:35 | 显示全部楼层
二、数组作参数的一般方法
数组作参数时等同于指针作参数,因此一般写成指针。但指针是不知道长度的,所以一般作法是增加一个参数来传递长度。

  1. #include <stdio.h>

  2. void subFunc(int *, int);  //这样申明是正确的

  3. int main(void)
  4. {
  5.     int i, len ;
  6.     int num[] = {10, 20, 30};

  7.     subFunc(num, 3);    //调用子函数

  8.     //显示数组内容
  9.     printf("\nmain中调用后显示:");
  10.     for (i=0; i<3; i++) {
  11.         printf("%3d", num[i]);
  12.     }
  13.     printf("\n");

  14.     return 0;
  15. }

  16. void subFunc(int *arr, int size)   //数组和长度同时传递是比较好的做法
  17. {
  18.     int i ;

  19.     for(i=0; i<size; i++) {
  20.         printf("%3d", ++arr[i]);
  21.     }

  22.     return ;
  23. }

本帖子中包含更多资源

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

×
 楼主| niuyaliang 发表于 2015-3-17 20:36 | 显示全部楼层
还有一种做法,将数组长度申明为常量,无论何处直接使用常量。注意:申明的后面不能加分号。

  1. #include <stdio.h>

  2. #define LENGTH 3     //注意:不能加分号“;”

  3. void subFunc(int *);

  4. int main(void)
  5. {
  6.     int i ;
  7.     int num[] = {10, 20, 30};

  8.     subFunc(num);    //调用子函数

  9.     //显示数组内容
  10.     printf("\nmain中调用后显示:");
  11.     for (i=0; i<LENGTH; i++) {      //直接使用常量
  12.         printf("%3d", num[i]);
  13.     }
  14.     printf("\n");

  15.     return 0;
  16. }

  17. void subFunc(int *arr)
  18. {
  19.     int i ;

  20.     for(i=0; i<LENGTH; i++) {      //直接使用常量
  21.         printf("%3d", ++arr[i]);
  22.     }

  23.     return ;
  24. }

本帖子中包含更多资源

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

×
 楼主| niuyaliang 发表于 2015-3-17 20:37 | 显示全部楼层
三、防止空指针
指针作参数时,调用的地方有二种情况,一是用数组名,二是用指针变量名。数组名是已经分配了空间的地址,直接使用没有问题。指针的话,可能分配了空间,也有可能是空指针、野指针、未初始化的指针。

  1. #include <stdio.h>

  2. #define LENGTH 3

  3. void subFunc(int *);

  4. int main(void)
  5. {
  6.     int *num = NULL;

  7.     subFunc(num);    //调用子函数

  8.     return 0;
  9. }

  10. void subFunc(int *arr)
  11. {
  12.     int i ;

  13.     if (arr == NULL) {        //对指针要经常判断,这一点非常重要
  14.         printf("数据为空。\n");
  15.         return ;
  16.     }

  17.     for(i=0; i<LENGTH; i++) {      //直接使用常量
  18.         printf("%3d", ++arr[i]);
  19.     }

  20.     return ;
  21. }

本帖子中包含更多资源

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

×
 楼主| niuyaliang 发表于 2015-3-17 20:37 | 显示全部楼层
四、sizeof错了吗
下面的程序是测试你对本章的理解,如果你不看结果图而能写出答案,说明你掌握得不错。

  1. #include <stdio.h>

  2. void func(char *);

  3. int main(void)
  4. {
  5.     char s[] = "abcd\0efghij";
  6.     char *t  = "ABCD\0EFGHIJ";
  7.     char *ps = s + 5;
  8.     char *pt = t + 5;

  9.     //不看结果,你能算出答案吗?
  10.     printf("main: strlen=%d, sizeof=%d\n", strlen(s), sizeof(s));
  11.     func(s);
  12.     printf("ps: %s\n", ps);

  13.     printf("main: strlen=%d, sizeof=%d\n", strlen(t), sizeof(t));
  14.     func(t);
  15.     printf("pt: %s\n", pt);

  16.     return 0;
  17. }

  18. void func(char *str)
  19. {
  20.     printf("func: strlen=%d, sizeof=%d\n", strlen(str), sizeof(str));

  21.     return ;
  22. }

本帖子中包含更多资源

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

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

本版积分规则

212

主题

2427

帖子

7

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