数组的总结

数组

一、一维数组的创建和初始化

1.数组的创建

数组是一组相同类型元素的集合。   int arr[10];

注:创建数组,[]中要给一个常量。

2.数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。

int arr1[10]={0};

int arr2[4]={1,2,3,4};

注:数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。

int arr[]={a,b,c};

二、一维数组的使用

1.[] 数组访问操作符。

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

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

int arr[10]={0};

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

三、一维数组在内存中的存储

数组在内存中是连续存放的,且随着数组下标的增长,元素的地址也在有规律的递增。

   四、指针的初步介绍

1.内存中的一个内存单元(字节)对应一个地址。

2.在32位的平台上指针的大小是4个字节,64位平台上是8个字节。

3.指针可以理解为一个变量,是一个专门用来存放地址的一个变量。

int num=10;

int *p=#//将num的地址存放到p指针变量中

五、一维数组的指针访问

1:

int main()

{

    int arr[]={1,2,3,4,5,6,7,8,9,0};

    printf(%p\n,arr);//输出的是数组arr首元素的地址

    printf(%d\n,*arr);//输出的是数组arr首元素的值  1

    return 0;

}

2:

int main()

{

    int arr[10]={0};

    int i=0;

    //int* p=&arr[0];

    int* p=arr;//数组名是数组首元素的地址

    for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)

    {

       *(p+i)=i;//用指针对数组中的元素进行0-9的初始化

       printf(%d\n,*(p+i));

    }

    retutn 0;

}

六、二维数组的创建和初始化

1.二维数组的创建:int arr[3][4];

2.二维数组的初始化:int arr[3][4]={1,2,3,4}

七、二维数组的使用

例:int main()

{

    int arr[3][4]={0};

    int i=0;

    int y=0;

    for(i=0;i<3;i++)

   {

      for(j=0;j<4;j++)

      {

         arr[i][j]=4*i+j+1;//对数组进行0-12的初始化

         printf(%d,arr[i][j]);

       }

    }

        return 0;

}

八、二维数组在内存中存储

例:int main()

{

    int arr[3][4]={0};

    int i=0;

    int j=0;

    for(i=0;i<3;i++)

   {

      for(j=0;j<4;j++)

      {

         printf(&arr[][]=%p\n,i,j,&arr[i][j]);

       }

     }

     return 0;

  }

结论:二维数组在内存中也是连续存放的,所以二维数组的行可省

    略而列不可以省略。

 九、二维数组的指针访问

 二维数组数组名当作首元素的地址时,代表的是第一行这样一个一维数组的地址。

 int *p=&arr[0][0];//指针变量p中存放的是数组下标为(0,0)的首元素的地址

 arr[i]==*(arr+i)==*(i+arr)==i[arr]

 十、有关数组的运算

 //一维数组

int a[]={1,2,3,4};//int 4个字节

printf(%d\n,sizeof(a));//sizeof(a),a表示整个数组4*4=16

printf(%d\n,sizeof(a+0));/*a+0表示首元素的地址(4个字节)4 */

printf(%d\n,sizeof(*a));//*a表示首元素的地址  4

printf(%d\n,sizeof(a+1));/*(a+1)表示下标为1的元素的地址 4 */

printf(%d\n,sizeof(a[1]));//同上  4

printf(%d\n,sizeof(&a));//&a取出的是地址,地址4个字节

printf(%d\n,sizeof(&a+1));/*&a取出的是数组的地址,&a+1取出的是整个地址之后的地址,即&a+1跳过了整个数组*/

printf(%d\n,sizeof(&a[0]));//&a[0]表示a[0]的地址 4

printf(%d\n,sizeof(&a[0]+1));&a[0]+1表示a[1]的地址 4

 //字符数组

char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };/*char(1个字节)*/

printf("%d\n", sizeof(arr));/*6 此处arr表整个数组大小*/

printf("%d\n", sizeof(arr + 0));/*4 arr+i表下标为i的元素的地址(4个字节)*/

printf("%d\n", sizeof(*arr));/*1 arr不单独放时表首元素地址,*arr表首元素的值*/

printf("%d\n", sizeof(arr[1]));//1 下标为1的元素的值

printf("%d\n", sizeof(&arr));//4 &arr表数组的地址

printf("%d\n", sizeof(&arr + 1));/*4 &arr+1表整个数组后面的地址*/

printf("%d\n", sizeof(arr[0] + 1));/*4  下标为1的地址/*

 

printf("%d\n", strlen(arr));/*随机值 不知道'\0'在何处*/

printf("%d\n", strlen(arr + 0));//随机值 同上

printf("%d\n", strlen(*arr));/*错误代码 *arr表数组首元素的值,strlen(*arr)表将'a'的ASC码值传给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(从第二个元素开始跳过了数组)*/

 

char *p = "abcdef";

printf("%d\n", sizeof(p));/*4 p为指针变量,且指向a的地址*/

printf("%d\n", sizeof(p+1));//4 p+1指向b的地址

printf("%d\n", sizeof(*p));//1 *p表首元素的值

printf("%d\n", sizeof(p[0]));//1 同上

printf("%d\n", sizeof(&p));//4 &p表p的地址

printf("%d\n", sizeof(&p+1));/*4 &p+1取出的是p后面的地址*/

printf("%d\n", sizeof(&p[0]+1));/*4 &p[0]表首元素a的地址,&p[0]+1表b的地址*/

 

printf("%d\n", strlen(p));//6=6*1

printf("%d\n", strlen(p+1));/*5 p为字符指针,p+1向后跳一个字节*/

printf("%d\n", strlen(*p));//错误代码

printf("%d\n", strlen(p[0]));//错误代码

printf("%d\n", strlen(&p));//随机值

printf("%d\n", strlen(&p + 1));//随机值

printf("%d\n", strlen(p[0] + 1));//5 从b开始往后数

 

char arr[] = "abcdef";

printf("%d\n", sizeof(arr));/*7 arr单独放在sizeof内,表整个数组*/

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 下标为1的元素的地址*/

printf("%d\n", sizeof(*&arr));/*7 &arr表整个数组的地址,*&arr表整个数组的大小*/

 

printf("%d\n", strlen(arr));//6

printf("%d\n", strlen(arr + 0));//6

printf("%d\n", strlen(*arr));//错误代码

printf("%d\n", strlen(arr[1]));//错误代码

printf("%d\n", strlen(&arr));/*6 从第一个元素开始往后数*/

printf("%d\n", strlen(&arr + 1));//随机值

printf("%d\n", strlen(&arr[0] + 1));/*5 从第二个元素开始往后数 */

//二维数组

int a[3][4] = { 0 };

printf("%d\n", sizeof(a));//3*4*4=48

printf("%d\n", sizeof(a[0][0]));//4

printf("%d\n", sizeof(a[0]));//4*4=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


总结:

    数组名代表整个数组的时候只有两种情况:

    1.sizeof(数组名),这里的数组名表示整个数组。

    2.&数组名,这里的数组名表示整个数组。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值