数组的总结

1.一维数组;
a.数组的创建

int arr[10]={0};

   int 表示创建的数组为int型数组;[10] 表示该数组的元素个数;10个元素的类型也为int型;

*注意:创建数组时方括号里面的数表示元素的个数,只能用常量或者是define定义的

标识符表示,不能是变量;

b.数组的初始化:

1.int arr[10]={0} 表示创建好的数组元素都初始化为0;
2.int arr[10]={1,2,3,4,5,6,7,8,9,10} ,数组每个元素都给了对应的初始化指;
3.int arr[]={1,2,3},此时数组的大小就可以通过元素的个数得到;
4.int arr[10]={1,2,3,4,5},此时数组中其他元素就为随机值(一般时候为0);

*注意:数组使用时,方括号里的数都为数组的下标,而数组的下标是从0开始的,

所以,数组的第n个元素就用数组名[n-1]来表示。

c.数组在内存中的存储:
1.数组在内存中是连续存储的;
2.随着下标增长地址由低到高;


d.一维数组与指针;

指针变量是指一个指针类型的变量;

数组的数组名就是一个指针变量,它指的是数组的地址,也是首元素的地址;
 int arr[10]={1,2,3,4,5,6,7,8,9,0}

 int *p=arr;

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

{

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

}

注意:只要通过一个指针变量拿到一个数组的首元素地址时,我们就可以通过这个指针拿到这个数组中的每一个元素;

        *(arr+i)=*(i+arr)=i[arr],i,arr只是方括号的俩个操作数;
         *arr=*(arr+0)=arr[0] ,都表示首元素

指针的特点:

指针类型决定了指针访问的权限

指针类型不同结果不同

1.&(取地址符)后面直接跟数组名值得是整个数组,其值会和数组的首元素的地址的值一样,但是如果同时加1的话会直接跳过整组。

  2、sizeof后面直接跟数组名指的是求整个数组的大小。

e.一维数组使用和定义中所要注意的问题

char arr1[]=”abc”;该数组中包含了a,b,c三个元素

char arr2[3]={‘a’,’b’,’c’};该数组包含了’a’ , ’b’ , ’c’ , ’\0’ 四个元素

2.二维数组;

a.二维数组的创建:

Int arr[3][5]

char arr[3][5]

double arr[3][5]

b. 数组的初始化:

Int arr[3][4]={1,2,3,4};

Int arr[3][4]={{1,2}{3,4}}

Int arr[][4]={{1,2}{3,4}}

注:行可以不写但是列一定要写。

c. 二维数组在内存中的存储:

1. 数组a的地址是ffc1,数组a[0]的地址也是ffc1,即a = a[0];

2.元素a[0][0]的地址是ffc1,所以数组a[0]的地址和元素a[0][0]的地址相同,即a[0] = &a[0][0];

3.最终可以得出结论:a = a[0] = &a[0][0],以此类推,可以得出a[1] = &a[1][0]

d二维数组在内存中跟一维数组一样是连续存储的。

     二位数组的数组名其实和一维数组是一样的,它也是一个指针,但不同的是,它指向的是二位数组的第一行的首地址,代表整个第一行,也就是说他是一个指向指针的指针。但是如果  &  操作符和  sizeof   后面紧跟着数组名的话,它指向的是整个数组。这一点与一维数组也是一样的。  

            例如:int arr[6][5]={ 0 }

                      首先我们知道,arr是一个二级指针,所以两次解引用后 **arr  就是数组的第一个元素arr[0][0] ,即**arr = arr[0][0] , 也就是 *arr=&arr[0][0] , 那么arr[0]值得是什么呢?我们可以这样想,arr[0]已经指出了数组的第一行,但未指出第几个元素,同一维数组 arr[0]=*(arr+0) ,因为arr是一个二级指针,所以我们可以知道*(arr+0)也是一个指针,而它指的就是二维数组第一行的首元素的地址,其就相当于一维数组的数组名所代表的意思。同理,我们可以推出arr指的就是第一行的地址,arr+1就是第二行的地址,以此类推。

3.数组的运算;

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[1])); //4 第二个元素
  printf("%d\n",sizeof(&a)); //4 数组的地址
  printf("%d\n",sizeof(*&a)); //16 数组的大小&取的是数组首元素的地址*&指向整个数组) 

printf("%d\n",sizeof(&a+1)); //4 是一个地址
    printf("%d\n",sizeof(&a[0])); //4 首元素地址

   printf("%d\n",sizeof(&a[0]+1)); //4 第二个元素地

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)); //随机值x 执行需遇到"\0"结束

printf("%d\n", strlen(arr + 0)); //随机值x 执行需遇到"\0"结束

printf("%d\n", strlen(*arr)); //error 执行的"a"的ASCII

printf("%d\n", strlen(arr[1])); //error 执行的"b"的ASCII

printf("%d\n", strlen(&arr)); //随机值x 执行需遇到"\0"结束

printf("%d\n", strlen(&arr + 1)); //随机值x-6 执行需遇到"\0"结束

printf("%d\n", strlen(&arr[0] + 1)); //随机值x-1 执行需遇到"\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[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)); //6 数组的长度

printf("%d\n", strlen(arr+0); //6 数组的长度

   printf("%d\n", strlen(*arr)); //error 执行的"a"的ASCII

   printf("%d\n", strlen(arr[1])); //error 执行的"b"的ASCII

   printf("%d\n", strlen(&arr)); //6 数组的长度

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

   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 首元素

printf("%d\n", sizeof(&p + 1)); //4 跳过p的地址

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 执行的"a"的ASCII

   printf("%d\n", strlen(p[0])); //error 执行的"a"的ASCII

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

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


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 sizeof(表达式) 内部表达式不计算。这里就表示一行元素

*注意:sizeof(数组名)—数组名表示整个数组
sizeof(数组名)—求取的是整个数组的大小,单位是字节;
&数组名—数组名表示整个数组;
所以&数组名,取出整个数组的地址;
除此之外,所遇到数组名都是首元素地址;
sizeof里面运算表达式不参与计算;
strlen()作用是测试字符串长度。这里不包括‘ \0’ . 使用形式 strlen(数组名或字符串常量 )


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值