zoukankan      html  css  js  c++  java
  • C语言数组和指针 owen

    数组有一系列相同的元素构成。使用数组声明来告诉编译器需要一个数组。数值声明包括数组元素的数目和元素的类型。

    要访问数组中的元素可以使用下标(index)来表示单个元素,index是从0开始计数的

    数组的初始化:

    比如

    days[12]={31,29,31303130313130313031}

    如果数组没有初始化

    比如

    int no_data[4]

    当打印出数组元素时,数组的值是不定的。因为编译器使用的数值是存储单元中已有的数值。

    初始化列表中的元素数目应该和数组大小一致。如果二者不一致:

    1.比如当数值数目少于数组元素数目时,多余的数组元素被初始化为0。例子如下:

     1 #include <stdio.h>
    2 #define SIZE 4
    3 int main(void)
    4 {
    5 int some_data[SIZE]={1492,1066};
    6 int i;
    7 printf("%2s%14s\n","i","some_data[i]");
    8 for(i=1;i<SIZE;i++)
    9 printf("%2d%14d\n",i,some_data[i]);
    10 return 0;
    11 }

    output:

     i  some_data[i]
    1 1066
    2 0
    3 0

    2.如果初始化列表中项目的个数大于数组大小,编译器会认为这个一个错误。程序就无法运行。

    可以省略括号中的数字,从而让编译器自动匹配数组的大小和初始化列表中的项目数目

     1 #include <stdio.h>
    2 int main(void)
    3 {
    4 const int days[]={31,28,31,30,31,30,31,31,30,31};
    5 /*const:
    6 有时需要使用只读数组,也就是程序从数组中读取数值,但是程序不想数组中写入数据。在这种情况下,可以使用关键字const。这样,程序会把数组中的每个元素当成常量来处理。用const声明之后不能再对它赋值*/
    7 int index;
    8 /*运算符sizeof给出其后的对象或类型的大小(以byte为单位)*/
    9 for(index=0;index<sizeof days/sizeof days[0];index++)
    10 printf("Monsth %2d has %d days.\n",index+1,days[index]);
    11 return 0;
    12 }

    多维数组

    多维数组是数组的数组。比如5年中每月的降水用float rain[5][12]来表示。可以解释为rain具有5个元素,并且每个元素都是包含12个float数值的数组。

    用二维视图表示数组可以直观的想象两个索引的数组。实际上,数组是顺序存储的,前12个元素之后,耕者就是第二个包含23个元素的数组。

    多维数组的初始化要注意几个问题:

    1.比如:

    const float rain[5][12]={
    {4.3,4.3,1.2,3.0},
    {5.2,3.0,1.6,3.5},
    ......
    }

    第一个列表中只有4个数值,则第一行只有前4个元素得到赋值,最后8个元素被默认初始化为0。如果列表中的数值多于12个,则报告错误,程序无法运行,而且这些数值不会影响到下一行的赋值。

    2.初始化的时候也可以省略内部的花括号,只保留最外面一对花括号。只要保证数值的个数正确,初始化效果就是一样的。如果数值的个数不够,那么在数组初始化时候,按照先后顺序来逐行赋值,一次前面的元素首先得到赋值,直到后面没有赋值的元素被初始化为0.

    指针和数组

    数组名同时也是该数组首元素的地址

     1 #include <stdio.h>
    2 #define SIZE 4
    3 int main(void)
    4 {
    5 short dates[SIZE];
    6 short * pti;
    7 short index;
    8 double bills[SIZE];
    9 double * ptf;
    10
    11 pti=dates; /*把数组的首地址赋给指针*/
    12 ptf=bills;
    13 printf("%23s %10s\n","short","double");
    14 for(index=0;index<SIZE;index++)
    15 printf("pointers + %d: %10p %10p\n",index,pti+index,ptf+index);
    16 return 0;
    17 }

    output:

                      short     double
    pointers + 0: 0028FF0C 0028FEE8
    pointers + 1: 0028FF0E 0028FEF0
    pointers + 2: 0028FF10 0028FEF8
    pointers + 3: 0028FF12 0028FF00

    在上面的例子中,对一个指针加1的结果是对该指针增加一个存储单元。

    因为在C语言中:对一个指针加1的结果是对该指针增加一个存储单元(也就是说:对指针加1,等价于对指针的值加上它指向的对象的字节大小)。对数组而言,地址会增加到下一个元素的地址,而不是下一个字节。

    比如: *(days+index)和days[index]等价

    //未完成



  • 相关阅读:
    swap文件查看
    内核调试神器SystemTap 转摘
    RPM软件包管理的查询功能 转
    systemtap跟踪C
    mysql 阿里内核人员
    systemtap 调试postgrel
    数据库大会
    solaris 软件包地址
    java实现大文件上传方案
    java实现大文件上传技术
  • 原文地址:https://www.cnblogs.com/owenbeta/p/2379653.html
Copyright © 2011-2022 走看看