C语言数组概述

目录

1.一维数组

1.1数组的创建

  • [ ]中必须是常量,不能是变量
char arr[10];       
float arr1[2];
double arr2[30];

1.2数组的初始化

  • 在不指定数组的大小时,必须进行初始化
char arr[] = "abc";
char arr1[3] = {'a','b','c'};
char *p = "abcd";               ///p中存的的是字符a的地址

1.3用指针访问数组

  • 数组在内存中是连续存放的;
  • 数组名相当于数组首元素的地址;&arr[ i ]等价于arr + i
  • 用指针访问时,p存的首元素地址,*p指向首元素,*(p+i)依次指向数组元素
int main()
{
    int arr[] = {1,2,3,4,5};
    int *p = arr;              //p中存的a的地址
    int i = 0;
    for(i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
        printf("%d", arr[i]);      //用arr[]打印
    }
    printf("\n");
    for(i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
        printf("%d", *(p+i));      //指针指向该数组元素
    }
    system("pause");
    return 0;
}

2.二维数组

2.1二维数组的创建

int arr[2][4];
char arr1[3][4];
float arr2[2][3];

2.2二维数组的初始化

  • 数组初始化时行可以省略,但列不行
int arr[3][4] = {1,2,3,4,5};     //按顺序存放
int arr[3][4] = {(1,2),(2,4,5)};        //指定位置
int arr[][4] = {(1,2),(3),(4,5)};

2.3指针访问二维数组

  • 二维数组在内存中也是连续存放的;
  • 二维数组的数组名表示第一行元素的地址;
int main()
{
    int arr[3][4] = {0};    //不完全初始化
    int *p = &arr[0][0];    //p中存放数组首元素地址
    int i = 0;
    for(i = 0; i < 3*4; i++)
    {
        *(p+i) = i;
    }
    for(i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
        int j = 0;
        for(j = 0; j < sizeof(arr[0]) / sizeof(arr[0][0]); j++)
        {
            printf("%d", arr[i][j]);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}

3.有关数组的运算

  • 对于sizeof( )——sizeof(数组名)中数组名相当于整个数组的大小,单位是字节;
  • &数组名 —— 取址,取出数组的地址;
  • strlen 遇到’ \0 ‘才停下,通过地址挨着往后数个数
  • 一维数组
//一维数组
int a[] = {1,2,3,4};
printf("%d\n", sizeof(a));    //16   整个数组的大小
printf("%d\n", sizeof(a+0));  //4    首元素的地址
printf("%d\n", sizeof(*a));   //4    首元素
printf("%d\n", sizeof(a+1));  //4    第二个元素
printf("%d\n", sizeof(&a));   //4    数组的地址
printf("%d\n", sizeof(*&a));  //16   指向整个数组
printf("%d\n", sizeof(&a+1));  //4   指向4后面
  • 字符数组 —— 不含’ \0 ‘
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])); //2    第二个元素
printf("%d\n", sizeof(&arr));   //4    数组的地址
printf("%d\n", sizeof(&arr+1));  //4    指向f后面

printf("%d\n", strlen(arr));      //x  随机值,从首元素开始数,遇到'\o'才停下
printf("%d\n", strlen(arr+0));    //x  随机值,和strlen(arr)一样
printf("%d\n", strlen(*arr));     //error  指向元素a,把元素a当做一个地址
printf("%d\n", strlen(&arr));     //x  随机值,相当于从首元素开始数
printf("%d\n", strlen(&arr+1));   //x  随机值,从f后面开始数
printf("%d\n", strlen(&arr[0]+1));  //x  随机值,从第二个元素开始往后数
  • 字符数组 —— 含’ \0 ‘
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));     //7    数组大小中含有'\0'
printf("%d\n", sizeof(arr+0));   //4    首元素地址
printf("%d\n", sizeof(*arr));    //1    首元素
printf("%d\n", sizeof(&arr));    //4    数组地址
printf("%d\n", sizeof(&arr+1));   //4    指向f后面
printf("%d\n", sizeof(&arr[0]+1));   //4  第二个元素地址

printf("%d\n", strlen(arr));     //6   从首元素开始数,遇到'\0'停下
printf("%d\n", strlen(arr+0));   //6   同strlen(arr)一样
printf("%d\n", strlen(*arr));    //error  指向第一个元素
printf("%d\n", strlen(&arr));    //6   数组的地址和首元素地址相同
printf("%d\n", strlen(&arr+1));  //x  从f后面开始数
printf("%d\n", strlen(&arr[0]+1));  //5  第二个元素
  • 指针型变量引用数组
char *p = "abcdef";
printf("%d\n", sizeof(p));     //4    首元素地址
printf("%d\n", sizeof(p+1));   //4    第二个元素地址
printf("%d\n", sizeof(*p));    //1    第一个元素
printf("%d\n", sizeof(p[0]));   //1    第一个元素,等同于*(p+0)
printf("%d\n", sizeof(&p));    //4     指针型变量本身的地址
printf("%d\n", sizeof(&p+1));    //4    指针型变量下一连续空间地址
printf("%d\n", sizeof(&p[0]+1));  //4   第二个元素地址

printf("%d\n", strlen(p));       //6    从首元素开始数
printf("%d\n", strlen(p+1));     //5    从第二个元素开始
printf("%d\n", strlen(*p));      //error   指向首元素
printf("%d\n", strlen(p[0]));    //error   同strlen(*p)
printf("%d\n", strlen(&p));      //x    随机值
printf("%d\n", strlen(&p+1));    //x  
printf("%d\n", strlen(&p[0]+1));   //5   第二个元素开始
  • 二维数组
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  第四行

猜你喜欢

转载自blog.csdn.net/mi_zhi_lu/article/details/80841838
今日推荐