数组

来源:互联网 发布:lte数据功能收费吗 编辑:程序博客网 时间:2024/05/21 11:26

  • 一维数组
    • 定义
    • 初始化
    • 访问数组
    • 数组大小计算
    • 数组的存储
  • 二维数组
  • 关于数组的运算

一维数组

定义

数组类型 数组名[数组大小];

数组定义时, [ ]中要给一个常量才可以,不能使用变量。
const修饰的变量是常变量,仍然是变量

初始化

数组可以只定义不初始化,但数组大小要明确指出

也可以不指出数组大小,在定义时初始化:
int arr1[ ] = {1,2,3};
数组的元素个数根据初始化的内容来确定。
如果非要给出大小,数组大小应大于给出初始化内容的个数

字符数组有两种初始化方式:
1.char arr1[] = {‘a’,’b’,’c’};
2.char arr2[] = “abc”;

这两种有区别,双引号里的内容代表字符串,末尾有一个隐藏的结束符’\0’,所以char arr2[] = “abc”; 等同于char arr1[] = {‘a’,’b’,’c’,’\0’};

访问数组

数组是使用下标来访问的,下标从0开始。
[],下标引用操作符。它其实就数组访问的操作符。
如果没有给数组赋初值,那么就要使用[]一个一个给数组元素赋值。

数组大小计算

对于字符串数组,可以用strlen函数计算大小(还不包括结束符),那么其他数组的大小怎么得到呢?
用关键字sizeof:

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

sizeof(arr)计算整个数组的大小
sizeof(arr[0])计算单个元素的大小
只要是数组,至少也有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;}

这里写图片描述
整型的大小是四个字节,第一个元素的地址+4刚好是第二个元素的地址,由此可见,数组是连续存储的
数组名是数组首元素的地址

数组是可以用指针访问的,而且a[0]=*(a+0)

二维数组

其实各种概念和一维数组类似,二维数组可以看成是数组的数组
比如 int arr[3][4]; 它可以看成是三个数组,数组名分别为arr[0],arr[1],arr[2],每个数组有4个元素

对了 二维数组定义的时候第二维的大小不能省略。

二维数组的存储其实不是像我们想象的那样第几行第几列那样的,它其实是连续的。
验证一下:

#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>#include<string.h>int main() {    //一维数组    int a[] = { 1,2,3,4 };    printf("%d\n", sizeof(a));//16 a单独在sizeof里,表示整个数组,计算整个数组的大小    printf("%d\n", sizeof(a + 0));//a表示数组首元素的地址,即int型地址,4个字节    printf("%d\n", sizeof(*a));//*a=*(a+0)=a[0],a[0]是int型,即4个字节    printf("%d\n", sizeof(a + 1));//a表示数组首元素地址,+1后表示第二个元素的地址,仍然是一个地址,4个字节    printf("%d\n", sizeof(a[1]));//4    printf("%d\n", sizeof(&a));//4,整个数组的地址    printf("%d\n", sizeof(&a + 1));//4,整个数组的地址+1,即紧跟数组最后一个元素的地址    printf("%d\n", sizeof(&a[0]));//a[0]的地址,4个字节    printf("%d\n", sizeof(&a[0] + 1));//a[1]的地址,4个字节    return 0; }
#include<stdio.h>#include<string.h>int main() {    //字符数组    char arr[] = { 'a','b','c','d','e','f' };    printf("%d\n", sizeof(arr));//arr表示整个数组,计算整个数组的大小,6    printf("%d\n", sizeof(arr + 0));//arr表示首元素的地址,4    printf("%d\n", sizeof(*arr));//*arr=*(arr+0)=a[0],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));//arr[1]的地址,4    printf("%d\n", strlen(arr));//首元素开始,到结束符共有多少个字符,没有结束符,没办法算,随机值    printf("%d\n", strlen(arr + 0));//同上//  printf("%d\n", strlen(*arr));//*arr=*(arr+0)=arr[0]='a',strlen的参数是一个地址,参数类型不符//  printf("%d\n", strlen(arr[1]));//同上    printf("%d\n", strlen(&arr));//整个数组的地址开始,到结束符,没有结束符,随机值    printf("%d\n", strlen(&arr + 1));//上值-6    printf("%d\n", strlen(&arr[0] + 1));//上值+5    reuturn 0;}
#include<stdio.h>#include<string.h>int main() {    char *p = "abcdef";    printf("%d\n", sizeof(p));//p是char*类型,内容为首元素a的地址,4    printf("%d\n", sizeof(p + 1));//b的地址,4    printf("%d\n", sizeof(*p));//*p = *(p+0)=p[0]=‘a’,1    printf("%d\n", sizeof(p[0]));//1    printf("%d\n", sizeof(&p));//p的地址 4    printf("%d\n", sizeof(&p + 1));//整个数组之后的地址,4    printf("%d\n", sizeof(&p[0] + 1));//p[1]的地址4    printf("%d\n", strlen(p));//6    printf("%d\n", strlen(p + 1));//5//  printf("%d\n", strlen(*p));//'a',参数类型不符合//  printf("%d\n", strlen(p[0]));//同上    printf("%d\n", strlen(&p));//和字符串无关了,随机值    printf("%d\n", strlen(&p + 1));//少四个字节,上值-4    printf("%d\n", strlen(&p[0] + 1));//5    return 0;}
#include<stdio.h>#include<string.h>int main() {    //二维数组    int a[3][4] = { 0 };    printf("%d\n", sizeof(a));//a表示整个数组,计算的是整个数组的大小 3*4*4=48    printf("%d\n", sizeof(a[0][0]));//4    printf("%d\n", sizeof(a[0]));//a[0]表示第一行数组的大小,4*4=16    printf("%d\n", sizeof(a[0] + 1));//= a[0]+1 = &a[0][0]+1 = &a[0][1] ,4     printf("%d\n", sizeof(a + 1));//a代表首元素的地址,这时的首元素是第一行的数组名 = &a[0]+1 = &a[1],4    printf("%d\n", sizeof(&a[0] + 1));//同上    printf("%d\n", sizeof(*a));//*a=*&a[0]=a[0] ,16    printf("%d\n", sizeof(a[3]));//没有a[3],但sizeof才不理会这些,和前边a[0],a[1]类似,结果是16    return 0;}
原创粉丝点击