对数组的简单总结

来源:互联网 发布:华师在线网络教育怎么 编辑:程序博客网 时间:2024/06/05 00:18
一、一维数组的创建和初始化
1.数组的创建:
type_t     arr_name     [const_n];     type_t是指数组的元素类型,const_n是一个常量表达式
eg:   int arr1[10] ;整型数组
        int *arr2[10]; 指针数组
        int count = 10; int arr3[count];
        char   arr4[10];
        float arr5[1];
        double arr6[20];
注意:int arr[n] 错误,[ ]中要给一个常量,变量不可以
           int arr[ ]={0};表示只有一个数组元素
2.数组的初始化:在创建数组的同时给数组的内容一些合理初始值(初始化)。
eg:   int arr1[ ] = {1,2,3,4};
        char arr2[3] = {'a',98, 'c'};    char arr3[ ] = {'a','b','c'}; (两种写法相同)
        char arr4[ ] = "abcdef";(放有7个元素,最后一个为"\0")
注意:数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初 始化的内容来确定。
二、一维数组的使用
[ ] ,下标引用操作符,它其实就数组访问的操作符。
(1)数组是使用下标来访问的,下标是从0开始。
(2)数组的大小可以通过计算得到。
    int arr[10];    
    int sz = sizeof(arr)/sizeof(arr[0]);
数组在内存中是连续存放的,随着数组下标的增长,元素的地址呈递增规律。
三、一维数组的指针访问
1.指针的初步介绍
指针可以理解为一个变量,是一个专门用来存放地址的一个变量。
在C语言中取出某个变量的地址。
eg:    int n = 10;     &n;   //取出n的地址。
指针变量的定义:
eg:    int (char)(double)  *ptr = NULL;  //定义一个指针变量,初始化为NULL
2.一维数组的指针访问
数组的数组名其实是数组首元素的地址。
通过对数组名+整数的运算,其实可以获取到数组每个元素的地址,可以使用指针来访问数组。
eg:  #include <stdio.h>
       int main()
       {
         int arr[10] = {0};    
         int i = 0;    
         int *p_arr = arr;    
         for(i=0; i<sizeof(arr)/sizeof(arr[0]); ++i)    
         {
           *(p_arr+i) = i;    
         }
        for(i=0; i<sizeof(arr)/sizeof(arr[0]); ++i)   
         {        
           printf("%d\n", *(p_arr+i));   
         }    
        return 0;
       }
三、二维数组的创建和初始化
1.   二维数组的创建
eg:   int (char)(double) arr[3][4];
2.二维数组的初始化
eg:   int arr[3][4] = {1,2,3,4};    
        int arr[3][4] = {{1,2},{4,5}};
        int arr[ ][4] = {{2,3},{4,5}};
四、二维数组的使用
1.  二维数组在内存中的存储
二维数组在内存中也是连续存储的。
二维数组的行数可以省略,但列数不可以省略。
2.  二维数组的指针访问
eg:   #include <stdio.h>
        int main()
        {    
           int arr[3][4] = {0};    
           int *p = &arr[0][0];    
           int i = 0;    
           for(i=0; i<3*4; i++)    
           {        
               *(p+i)= i;  (等价于arr[i] = i;)    
           }    
            for(i=0; i<3; i++)    
           {        
               int j = 0;        
               for(j=0; j<4; j++)        
               {            
                    printf("%d ", arr[i][j]);       
               }    
           }    
          return 0;
        }
五、数组的运算
&数组名——数组名表示整个数组,取出来的是数组的地址
sizeof(数组名)——数组名表示整个数组,求的是整个数组的大小
除此之外,所有的数组名都表示首元素的地址
1.一维数组
eg:
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));                     // 6(字节)
printf("%d\n", sizeof(arr+0));                 // 4
printf("%d\n", sizeof(*arr));                    // 1
printf("%d\n", sizeof(arr[1]));                 // 1
printf("%d\n", sizeof(&arr));                   // 4
printf("%d\n", sizeof(&arr+1));               // 4
printf("%d\n", sizeof(&arr[0]+1));           // 4
 
printf("%d\n", strlen(arr));                      // 随机值
printf("%d\n", strlen(arr+0));                  // 随机值
printf("%d\n", strlen(*arr));                     // 代码错误
printf("%d\n", strlen(arr[1]));                  // 代码错误
printf("%d\n", strlen(&arr));                    // 随机值
printf("%d\n", strlen(&arr+1));                // 随机值
printf("%d\n", strlen(&arr[0]+1));            // 随机值
 2.二维数组
eg:
int a[3][4] = {0}; 
 printf("%d\n",sizeof(a));                        // 48
printf("%d\n",sizeof(a[0][0]));                 // 4
printf("%d\n",sizeof(a[0]));                     // 16
printf("%d\n",sizeof(a[0]+1));                 // 4
printf("%d\n",sizeof(a+1));                     // 4
printf("%d\n",sizeof(&a[0]+1));              // 4
printf("%d\n",sizeof(*a));                       // 16
printf("%d\n",sizeof(a[3]));                     // 16
六、数组作为函数参数
获取数组的元素个数
eg:   void bubble_sort(int arr[])
        {    
            int sz = sizeof(arr)/sizeof(arr[0]); ——>(错误)
            …
        }
数组作为函数参数的时候,不会把整个数组的传递过去。实际上只是把数组的首元素的地址传递过去了。
即使在函数参数部分写成数组的形式:  int arr[ ] 表示的依然是一个指针: int *arr 。 
上面代码中的sz最后的值应该是1,而不是数组元素的个数。
























原创粉丝点击