初步解析数组
来源:互联网 发布:淘宝修改中差评工作室 编辑:程序博客网 时间:2024/06/09 21:28
一维数组的创建
type_t arr _name[const_n]; //type_t 数组类型 //arr_name 数组名称 //const_n 数组维度,必须放常量
注意: 声明时,如果数组内没有确定的元素必须设置数组维度.
int arr1[10]; int count = 10; int arr2[count]; //错误,count为变量不能放在[]中 const int count = 10; int arr2[count]; //在c语言中无法编译,证明count不是一个常量 char arr3[10]; float arr4[1]; double arr5[10]; //数组初始化 int arr1[10] = { 1, 2, 3 }; int arr2[] = { 1, 2, 3, 4 }; int arr3[5] = { 1,2,3,4,5 }; char arr4[3] = { 'a', 98, 'c' }; char arr5[] = { 'a', 'b', 'c' }; //若初始化时未设置数组维度,数组大小由元素个数决定 char arr6[] = "abcdef";//c风格字符串 char* p = "abcdef"; //arr5中元素:'a','b','c' //arr6中元素:'a','b''c''\0' //p是字符a的地址
一维数组的使用
数组是使用下标来访问的,下标是从0开始
int main() { int arr[10] = { 0 };//数组的不完全初始化。 //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以: int i = 0;//做下标 for (i = 0; i<10; i++) { arr[i] = i; } //输出数组的内容 for (i = 0; i<10; ++i) { printf("%d ", arr[i]); } return 0;}
数组的大小可以通过计算得到
int arr[10];int sz = sizeof(arr) / sizeof(arr[0]);
注意:数组名表示整个数组的地址只有两种情况:
1.sizeof(arr) 括号内没有其他任何符号
2.&arr
其余情况表示数组首元素地址.
因此在函数内部不可用sizeof求取数组维度,因为传参时无法传入整个数组的地址.
void bubble_sort(int arr[]){ int sz = sizeof(arr)/sizeof(arr[0]); ...}
这样应该是错误的。
数组作为函数参数的时候,不会把整个数组的传递过去。实际上只是把数组的首元素的
地址传递过去了。所以即使在函数参数部分写成数组的形式:
int arr[] 表示的依然是一个指针: int *arr 。
上面代码中的sz最后的值应该是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;}
随着数组下标的增长,元素的地址,也在有规律的递增。
由此可以得出结论:数组在内存中是连续存放的。
一维数组的指针访问
#include <stdio.h>int main(){ int arr[] = {1,2,3,4,5,6,7,8,9,0}; printf("%p\n", arr);//输出结果:006efeb8 printf("%d\n", *arr);//输出结果:1 return 0;}
由此可见,数组的数组名其实是数组首元素的地址。
#include <stdio.h>int main(){ int arr[10] = {0}; int i = 0; int *p_arr = arr; for(i=0; i<sizeof(arr)/sizeof(arr[0]); ++i) { *(p_arr+i) = i; } for(i=0; i<sizeof(arr)/sizeof(arr[0]); ++i) { printf("%d\n", *(p_arr+i));// } return 0;}
观察结果我们发现,通过对数组名+整数的运算,其实可以获取到数组每个元素的地址。
二维数组的创建和初始化
//数组创建int arr[3][4];char arr[3][5];double arr[2][4];//数组初始化int arr[3][4] = {1,2,3,4};int arr[3][4] = {{1,2},{4,5}};int arr[][4] = {{2,3},{4,5}};
二维数组的使用也是通过下标的方式。
#include <stdio.h>int main(){ int arr[3][4] = {0}; int i = 0; for(i=0; i<3; i++) { int j = 0; for(j=0; j<4; j++) { arr[i][j] = i*4+j; } } for(i=0; i<3; i++) { int j = 0; for(j=0; j<4; j++) { printf("%d ", arr[i][j]); } } return 0;}
运行结果
二维数组在内存中的存储
像一维数组一样,这里我们尝试打印二维数组的每个元素。
#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>int main(){ int arr[3][4] = {0}; int *p = &arr[0][0]; int i = 0; for(i=0; i<3*4; i++) { p[i] = i; } for(i=0; i<3; i++) { int j = 0; for(j=0; j<4; j++) { printf("%d ", arr[i][j]); } } return 0;}
输出结果依然是
另:
二维数组传参,数组名作为形参
void func1(int iArray[][10]) { ;} int main() { int array[10][10]; func1(array); }
形参声明一定要给出第二个维度的大小.
- 初步解析数组
- tomcat批处理文件初步解析
- java通信协议初步解析
- tomcat批处理文件初步解析
- ListView初步解析
- alibaba dexposed初步解析
- 【Android】Json解析初步
- AndroidMenifest.xml初步解析
- AsyncTask初步解析
- JSON解析初步
- mybatis源码初步解析
- 二叉树初步解析
- Java虚拟机初步解析
- DPDK多线程初步解析
- Servlet源码解析初步
- Gradle初步解析
- java数组初步
- 数组初步应用
- mysql主从复制出现connecting的其它情况
- *.pro、*.pri、*.prf、*.prl等四种文件
- 2017-07-27 小算法工程师的成长之路
- Jersey拦截器
- Oracle之 dmp导入/导出、数据库操作等过程中的字符集问题
- 初步解析数组
- ArcGIS——数据库与服务备份(一、oracle中的geodatabase备份使用impdp与expdp)
- PHP中is_callable()函数的用法详解
- 牛奶
- Android gc垃圾回收研究学习
- android 关于drawable那些事
- python 时间差的计算
- 矩阵分析与应用(一)——集合的基本运算和内积空间
- vs2015安装