当前位置:   article > 正文

C中的数组_#include int main() { int arr[10] = (0);

#include int main() { int arr[10] = (0); const int n = 10; int arr


一,一维数组

1.一维数组的含义:是一组相同类型元素的集合,定义数组时必须指定其元素的类型和个数。其大小与元素的类型和个数有关。数组可以存任何类型的数据,但不能存函数。

2.创建:

type_t arr_name [const_n];//type_t是数组的元素类型;const_n是常量,用来指定数组的大小;

注意:[  ]里要给一个常量,整形常量大于0,不能使用变量。在c语言中const 修饰的常量也不能使用(c++允许)。

下面看一个例子:

  1. #include<stdio.h>
  2. #include<windows.h>
  3. int main()
  4. {
  5. const int n = 10;
  6. int a[n];
  7. printf("%d\n", sizeof(a));
  8. system("pause");
  9. return 0;
  10. }

这个程序报错 :

3.初始化:在创建数组的同时给数组的内容一些合理初始值。

  1. int arr1[] = { 1, 2, 3, 4, 5 };
  2. char arr2[] = "abc";//{a,b,c,\0}
  3. char arr3[3] = { 'a', 'b', 'c ' };
  4. char*p = "abcdef";//{a,b,c,d,e,f,\0}

4.在内存中的存储:

下面看个代码:

  1. #include<stdio.h>
  2. #include<windows.h>
  3. int main()
  4. {
  5. int arr[10] = { 0 };
  6. int size = sizeof(arr) / sizeof(arr[0]);//数组的大小
  7. int i = 0;
  8. for (i=0; i < size; i++)
  9. {
  10. printf("&arr[%d]=%p\n", i, &arr[i]);
  11. }
  12. system("pause");
  13. return 0;
  14. }

输出结果是:

从打印结果可以看出数组在内存中是连续存放的。如果没有初始化,结果都是随机值。

5,指针的认识:指针就是地址。

指针变量在32位系统下,永远占4个byte,其值为某一个内存的地址。指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到。

int *p的理解:int*是指针变量,*是解引用,p是指针(地址),也就是说,我们把p称为指针变量,p 里存储的内存地址处的内存称为p所指向的内存。指针变量p里存储的任何数据都将被当作地址来处理

下面看一个代码:

  1. int n=10;
  2. int *p=&n;//把n的地址放在指针变量中
  3. *p=20;//n的内容

这个运行结果是n=20,即*p=n.

6.一维数组访问指针

首先来看一个程序:

  1. #include<stdio.h>
  2. #include<windows.h>
  3. int main()
  4. {
  5. printf("%p\n", a);//0020fde0
  6. printf("%p\n", a[0]);//00000001
  7. printf("%p\n", &a);//0020fde0
  8. printf("%p\n", &a[0]);//0020fde0
  9. printf("%p\n", *a);//00000001
  10. system("pause");
  11. return 0;
  12. }

可以看出a,&a,&a[0]的结果一样,其实呢,a[0]是一个元素(首元素),*p也是首元素,a是整个数组,虽然&a[0]和&a的值一样,但其意义不一样。前者是数组首元素的首地址,而后者是数组的首地址。由此可见,数组作为右值时,数组名就是首元素地址。即a=&a[0].也可以得到a+i=&a[i].

再看一个代码:

  1. #include<stdio.h>
  2. #include<windows.h>
  3. int main()
  4. {
  5. int a[10] = {0};
  6. int i = 0;
  7. int *p = a;
  8. for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
  9. {
  10. *(p + i) = i;
  11. }
  12. for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
  13. {
  14. printf("%d\n", *(p + i) = i);
  15. }
  16. system("pause");
  17. return 0;
  18. }

输出结果为0,1,2,3,4,5,6,7,8,9.由此可见*(p+i)=a[i].

二,二维数组

二维数组就看成一个一位数组。

1.二维数组的创建:

  1. int arr[3][4];
  2. char arr[3][5];
  3. double arr[2][4]

2.初始化:

intarr[3][4] = {1,2,3,4};      //  1234 1234 1234
intarr[3][4] = {{1,2},{4,5}};   // 1200 4500 0000

3二维数组在内存中也是连续储存的。

4.二维数组的指针访问:

  1. #include<stdio.h>
  2. #include<windows.h>
  3. int main()
  4. {
  5. int arr[3][4] = { 0 };
  6. int*p = &arr[0][0];
  7. int i = 0;
  8. for (i = 0; i < 3 * 4; i++)
  9. {
  10. *(p + i) = i;//*(p+i)=arr[i]
  11. }
  12. for (i = 0; i < 3; i++)
  13. {
  14. int j = 0;
  15. for (j = 0; j < 4; j++)
  16. {
  17. printf("%d ", arr[i][j]);//打印结果是0,1,2,3,4,5,6,7,8,9,10,11
  18. }
  19. }
  20. system("pause");
  21. return 0;
  22. }

注意:指针加1就是加上所指类型的大小。

三,数组作为函数参数:

数组传参是会发生降维问题,一维数组传参时会降成指向其内部元素类型的指针;二维数组传参时会降成一级指向其内部元素类型的指针。

  1. #include<stdio.h>
  2. #include<windows.h>
  3. void fun(int arr[][4], int size)
  4. {
  5. printf("%d\n", sizeof(arr));//打印结果是4,这里降成了int型指针。
  6. }
  7. int main()
  8. {
  9. int arr[3][4];
  10. int size = sizeof(arr) / sizeof(arr[0]);
  11. fun(arr, size);
  12. system("pause");
  13. return 0;
  14. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/668421
推荐阅读
相关标签
  

闽ICP备14008679号