初步解析数组

来源:互联网 发布:淘宝修改中差评工作室 编辑:程序博客网 时间:2024/06/09 21:28

一维数组的创建

type_t   arr _name[const_n];     //type_t 数组类型    //arr_name 数组名称    //const_n 数组维度,必须放常量

注意: 声明时,如果数组内没有确定的元素必须设置数组维度.

    int arr1[10];    int count = 10;    int arr2[count];    //错误,count为变量不能放在[]中    const int count = 10;    int arr2[count];    //在c语言中无法编译,证明count不是一个常量    char arr3[10];    float arr4[1];    double arr5[10];    //数组初始化    int arr1[10] = { 1, 2, 3 };    int arr2[] = { 1, 2, 3, 4 };    int arr3[5] = { 1,2,3,4,5 };    char arr4[3] = { 'a', 98, 'c' };    char arr5[] = { 'a', 'b', 'c' };    //若初始化时未设置数组维度,数组大小由元素个数决定    char arr6[] = "abcdef";//c风格字符串    char* p = "abcdef";    //arr5中元素:'a','b','c'    //arr6中元素:'a','b''c''\0'    //p是字符a的地址

一维数组的使用

数组是使用下标来访问的,下标是从0开始

int main() {    int arr[10] = { 0 };//数组的不完全初始化。     //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:     int i = 0;//做下标     for (i = 0; i<10; i++)     {         arr[i] = i;     }     //输出数组的内容     for (i = 0; i<10; ++i)     {         printf("%d ", arr[i]);     }     return 0;}

数组的大小可以通过计算得到

int arr[10];int sz = sizeof(arr) / sizeof(arr[0]);

注意:数组名表示整个数组的地址只有两种情况:
1.sizeof(arr) 括号内没有其他任何符号
2.&arr
其余情况表示数组首元素地址.
因此在函数内部不可用sizeof求取数组维度,因为传参时无法传入整个数组的地址.

void bubble_sort(int arr[]){    int sz = sizeof(arr)/sizeof(arr[0]);    ...}

这样应该是错误的。
数组作为函数参数的时候,不会把整个数组的传递过去。实际上只是把数组的首元素的
地址传递过去了。所以即使在函数参数部分写成数组的形式:
int arr[] 表示的依然是一个指针: int *arr 。
上面代码中的sz最后的值应该是1,而不是数组元素的个数。


一维数组在内存中的存储

#include <stdio.h>int main(){    int arr[10] = {0};    int i = 0;    for(i=0; i<sizeof(arr)/sizeof(arr[0]); ++i)    {    printf("&arr[%d] = %p\n", i, &arr[i]);    }    return 0;}

运行结果
随着数组下标的增长,元素的地址,也在有规律的递增。
由此可以得出结论:数组在内存中是连续存放的。


一维数组的指针访问

#include <stdio.h>int main(){    int arr[] = {1,2,3,4,5,6,7,8,9,0};    printf("%p\n", arr);//输出结果:006efeb8    printf("%d\n", *arr);//输出结果:1    return 0;}

由此可见,数组的数组名其实是数组首元素的地址。

#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;}


观察结果我们发现,通过对数组名+整数的运算,其实可以获取到数组每个元素的地址。


二维数组的创建和初始化

//数组创建int arr[3][4];char arr[3][5];double arr[2][4];//数组初始化int arr[3][4] = {1,2,3,4};int arr[3][4] = {{1,2},{4,5}};int arr[][4] = {{2,3},{4,5}};

二维数组的使用也是通过下标的方式。

#include <stdio.h>int main(){    int arr[3][4] = {0};    int i = 0;    for(i=0; i<3; i++)    {        int j = 0;        for(j=0; j<4; j++)        {        arr[i][j] = i*4+j;        }    }    for(i=0; i<3; i++)    {            int j = 0;        for(j=0; j<4; j++)        {        printf("%d ", arr[i][j]);        }    }    return 0;}

运行结果


二维数组在内存中的存储
像一维数组一样,这里我们尝试打印二维数组的每个元素。

#include <stdio.h>int main(){    int arr[3][4];    int i = 0;    for(i=0; i<3; i++)    {        int j = 0;        for(j=0; j<4; j++)        {            printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);        }    }     return 0;}

运行结果

通过结果我们可以分析到,其实二维数组在内存中也是连续存储的。
这里写图片描述
二维数组其实是数组的数组.
当一个数组的元素仍然是数组时,通常使用两个维度来定义它:一个维度表示本身大小,另一个维度表示其元素(也是数组)大小.
常把第一个维度称为行,第二个维度称为列.


二维数组的指针访问
知道了一维数组的内存存储模式之后,尝试使用指针对一维数组的访问。那这里
尝试使用指针来访问我们的二维数组。

#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;    }    for(i=0; i<3; i++)    {        int j = 0;        for(j=0; j<4; j++)        {            printf("%d ", arr[i][j]);        }    }    return 0;}

输出结果依然是


另:
二维数组传参,数组名作为形参

void func1(int iArray[][10])  {    ;}  int main()  {      int array[10][10];      func1(array); }  

形参声明一定要给出第二个维度的大小.

原创粉丝点击