C语言的数组学习入门之对数组初始化的操作

 更新时间:2015年12月02日 14:57:29   投稿:goldensun  
这篇文章主要介绍了C语言的数组学习入门之数组初始化的操作,是C语言入门学习中的基础知识,需要的朋友可以参考下

数组在所有的语言中,以C最为简单,就是一起始地址,外加一数组的长度,而且基本上没有任何功能可言。然而,在所有的数组使用中,却是C的这种简单的数组形式,以其灵活性和效率,让人惊叹。

C数组从逻辑上讲,是分形一致的(想不到其他词来形容了),分形的意思,就是部分与整体保持一致的构造形式,也即是数组的任何一部分也都是数组,比如一整型数组{1,2,3,4,5},连续取出其中任一连续的部分,都可以看成是一个数组,{2,3}是数组,{1,2,3}是数组,{4,5}也都是数组,差别只在于数组的起始地址和元素的个数。那怕是数组中的任何一个元素,都可以看成是一个长度为1的数组。因此,C数组的这种统一的格式,在作为参数,传递给函数的时候,特别是递归函数中,很是方便。

一些基础知识

先来看看一些基础的东西。

数组可以用一个列值来初始化,例如:

int arr[] = {1,2,3,4};
char arr[] = {'a','b','c',0};

简单的一个整数数组初始化例子:

#include "stdio.h"

int main()
{
  /*
  author: www.nowamagic.net
  */
  int i, length;
  int arr[] = {1,2,3,4};

  length = sizeof(arr) / sizeof(int);
  printf("sizeof(arr)为:%d\n", sizeof(arr));
  printf("sizeof(int)为:%d\n", sizeof(int));
  printf("数组长度为:%d\n", length);
  for(i = 0; i < length; i++)
  {
    printf("%d\n", arr[i]);
  }

  return 0;
}

程序运行结果:

sizeof(arr)为:16
sizeof(int)为:4
数组长度为:4
1
2
3
4

简单的一个char数组初始化例子:

#include "stdio.h"

int main()
{
  /*
  author: www.nowamagic.net
  */
  int i, length;
  char arr[] = {'a','b','c',0};

  length = sizeof(arr) / sizeof(char);
  printf("sizeof(arr)为:%d\n", sizeof(arr));
  printf("sizeof(char)为:%d\n", sizeof(char));
  printf("数组长度为:%d\n", length);
  for(i = 0; i < length; i++)
  {
    printf("%c\n", arr[i]);
  }

  return 0;
}

程序运行结果:

sizeof(arr)为:4
sizeof(char)为:1
数组长度为:4
a
b
c

假设给一二维数组初始化,将数组的每个元素都初始化为0

方法有两种:

1)使用循环逐个的把数组的元素赋值为0;

2)使用内存操作函数memset将数组所占的内存内容设置为0;

测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <string.h>

#define     K    15
#define     DIM   10
#define     LOOP  1000000

int main(int argc, char** argv)
{
    double     o_centers[K*DIM];
    int       i = 0, j = 0, k = 0;


    MPI_Init(&argc, &argv);

    printf("Start to test array assign...\n");
    double     starttime1 = MPI_Wtime();
    for(k = 0; k < LOOP; k++)
        for(i = 0; i < K; i++)
            for(j = 0; j < DIM; j++)
                o_centers[j + i*DIM] = 0;
    double     endtime1 = MPI_Wtime();
    printf("Array assign takes %5.12f seconds...\n", endtime1 - starttime1);


    printf("Start to test memset assign...\n");
    double     starttime2 = MPI_Wtime();
    for(k = 0; k < LOOP; k++)
        memset(o_centers, 0, K*DIM*sizeof(double));
    double     endtime2 = MPI_Wtime();
    printf("Memset assign takes %5.12f seconds...\n", endtime2 - starttime2);

    MPI_Finalize();
    return 0;
}

编译运行后,得到结果:

Start to test array assign...
Array assign takes 0.624787092209 seconds...
Start to test memset assign...
Memset assign takes 0.052299976349 seconds...

补充说明

如果数组定义的时候没有指定其大小,并且初始化采用了列表初始化,那么数组的大小由初始化时列表元素个数决定。所以上面例子中的数组分别为 int[4] 和char[4]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。

如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为0。例如:

int arr[8]={1,2,3,4};

等价于

int arr[8]={1,2,3,4,0,0,0,0};

字符数组可以方便地采用字符串直接初始化。

C的字符串,也很简单,它也是一个数组,只不过最后一个元素是'\nul',加了这么一点限制之后,字符串自然就失去了数组的分形强悍,但C的字符串依然不可小看,因为字符串中,只要带上了'\nul',都能看成是字符串,好比,”hello”这条字符串,只要改变起始地址,就可轻而易举地得到”ello”,”llo”,”lo”,”o”这好几条子字符串,这个特点,可以简化很多字符串操作,并且效率最高。此外,C字符串,只要你愿意,完成可以拿来当成是字符数组来使用,这样,就又恢复了数组分形功能,C函数库中和WINDOWS API,有很多函数就是专门处理C字符数组的。

C的很多东西,就是这样,因为简单,所以强大得另人惊叹。函数、结构体、数组、GOTO、枚举这些简单的东西,巧妙的配合使用,可以玩出很多很多意想不到的神奇功能出来,令人击节赞叹,而且不会像C++那样,存在着所谓的什么心智负担。此外,C中的宏,嘿嘿,俺就不提了,变化多端,鬼神莫测。对于C,我越来越敬畏,它远远不似表面上看的那么简单,其背后自然潜藏着一套精神规则。即使看到每一行C代码,内心都能知道它的相应的汇编代码,那又怎么样,它总是有办法让你惊喜不已。

C CodeBase 计划:对于编程问题,消灭一点,舒服一点;消灭很多,舒服很多;彻底消灭,彻底舒服。

相关文章

  • 探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题

    探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题

    本篇文章是对程序在的内存中分配(常量,局部变量,全局变量,程序代码)的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++ normal_distribution高斯正态分布函数的用法示例

    C++ normal_distribution高斯正态分布函数的用法示例

    高斯分布也称为正态分布(normal distribution),常用的成熟的生成高斯分布随机数序列的方法由Marsaglia和Bray在1964年提出,这篇文章主要给大家介绍了关于C++ normal_distribution高斯正态分布函数用法的相关资料,需要的朋友可以参考下
    2021-07-07
  • 详解如何使用C++写一个线程安全的单例模式

    详解如何使用C++写一个线程安全的单例模式

    这篇文章主要为大家详细介绍了如何使用C++写一个线程安全的单例模式,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2022-10-10
  • Qt实现编辑数据库数据的方法详解

    Qt实现编辑数据库数据的方法详解

    这篇文章主要为大家详细介绍了Qt是如何实现编辑数据库数据的,文中的示例代码简洁易懂,对我们深入了解QT有一定的帮助,感兴趣的小伙伴可以了解一下
    2023-02-02
  • 对比C语言中execv相关的执行文件的三个函数

    对比C语言中execv相关的执行文件的三个函数

    这篇文章主要介绍了对比C语言中execv相关的执行文件的三个函数,分别为execv()函数和execve()函数以及execvp()函数,需要的朋友可以参考下
    2015-08-08
  • opencv平均背景法详解

    opencv平均背景法详解

    这篇文章主要为大家详细介绍了opencv平均背景法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Qt 使用QDialog实现界面遮罩的示例(蒙版)

    Qt 使用QDialog实现界面遮罩的示例(蒙版)

    界面遮罩在很多时候都可以用到,例如弹窗,本文主要介绍了Qt 使用QDialog实现界面遮罩的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 一文详解C++11中decltype的使用

    一文详解C++11中decltype的使用

    这篇文章主要为大家分享了C++11中decltype关键字的使用示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2023-07-07
  • C语言实现三子棋小游戏详解

    C语言实现三子棋小游戏详解

    这篇文章主要为大家详细介绍了C语言实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • c++统计文件中字符个数代码汇总

    c++统计文件中字符个数代码汇总

    本文给大家汇总介绍了3种使用C++实现统计文件中的字符个数的方法,非常的简单实用,有需要的小伙伴可以参考下。
    2015-09-09

最新评论