企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 数组 定义一个数组并把他初始化为0,是个好习惯 int a[10]={0}; //java不需要这样,java会自动的 ## 一维数组指针和二维数组指针 二维数组指针是比如 `int * [4]`,因为二维数组名指向一维数组 一维数组是`char *`类似这种 ## 数组名是个常量指针 ~~~ //这样不可以 arr = NULL; ~~~ 在这2种情况下,数组名不是指向首元素的 sizeof和&arr取地址 ~~~ void printArray(int *arr, int len) { for (int i = 0; i < len; i++) { printf("%d\n", arr[i]); //也可以这样 printf("%d\n", *(arr + i)); } } ~~~ ## 数组指针类型和数组首元素指针类型 定义一个指向数组的指针 ~~~ int main() { int arr[5] = {1, 2, 3, 4, 5}; &arr; //我们先定义数组类型,再定义数组指针 typedef int(ARRAY_TYPE)[5]; ARRAY_TYPE myarray; //等于 int myarray[5] for (int i = 0; i < 5; i++) { myarray[i] = i * i; } ARRAY_TYPE *p = &myarray; //不能是指向首元素了,这边是数组指针了 //打印元素, 数组指针取地址等于数组名,数组名等于首地址 int ele = *(*p + 3); printf("%d\n", ele); getchar(); return 0; } ~~~ ~~~ int arr[5] = {1, 2, 3, 4, 5}; //定义数组指针类型 typedef int(*ARRAY_POINT)[5]; ARRAY_POINT pArr = &arr; ~~~ ~~~ int main() { int arr[] = {1, 2, 3, 4, 5, 6}; typedef int (*ARRAY_POINT)[6]; ARRAY_POINT pArr = &arr; printf("%d \n", *((*pArr) + 1)); getchar(); return 0; } ~~~ 输出 ~~~ 3 ~~~ ## 一维数组定义 数组就是在内存中连续相同类型的变量空间 ~~~ int a[10]; //定义了10个int,第一个变量名是a[0],最后一个是a[9],没有a[10]这个变量 ~~~ 这10个变量在内存中的位置是连续的 定义一个数组的时候,[]里面要用常量 但使用数组的时候里面可以是常量可以是变量 **数组在内存的存储方式** 同一个数组的所有成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的,数组名是一个地址的常量,代表数组中首元素的地址 ~~~ int a[10]; a[0]=1; a[3]=5; printf("%p,%p\n",a,&a[0]); ~~~ 2个地址是一样的 但是`a[0] +1` 代表下个元素,而a+1代表移动过整个数组 数组元素+1 (sizeof(数据类型)) 数组名+1 (sizeof(数组名)) ### 遍历数组 ~~~ int a[]={4,5,6,7,8,9,12,34}; int i; for (i = 0; i < sizeof(a)/sizeof(a[0]); ++i) { printf("a[%d] = %d\n",i,a[i] ); } ~~~ ## 二维数组 格式: `数据类型 数组名 [行个数] [列个数]` ~~~ int a2[2][10]; //a2是一个二维数组,这个二维数组中包含2个一维数组,a2[0],a2[1],这2个数组是连续的 ~~~ 二维数组的数组名代表首元素的地址的常量 ~~~ int a2[2][10]; printf("%p,%p,%p\n", a2,a2[0],&a2[0][0]); //值是一样的 ~~~ ### 二维数组的初始化 ![](https://box.kancloud.cn/fbae30fb318868450fea3c6997d3c969_1082x314.jpg) ### 二维数组的遍历 ~~~ int main(int argc, char const *argv[]) { int a3[][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}}; for (int i = 0; i < sizeof(a3)/sizeof(a3[0]); ++i) { for (int j = 0; j < sizeof(a3[0])/sizeof(a3[0][0]); ++j) { printf("a3[%d][%d] = %d\t", i,j,a3[i][j]); } printf("\n"); } return 0; } ~~~ ### 二维数组名 ~~~ int main() { int arr[3][5] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; //二维数组的数组名和一维数组一样 int a = *(*(arr + 1) + 2); printf("%d\n", a); //8 getchar(); return 0; } ~~~ ~~~ int arr[3][3] = { {1, 2, 3}, {6, 7, 8}, {11, 12, 13} }; arr是 int(*)[3] 类型的 ~~~ ~~~ char *arr3[] = {"aaa", "bbb", "ccc"}; arr3是char **类型的 ~~~ ## char数组 字符串就是子符数组以'\0'结尾 ~~~ char a[10]; a[0]='a'; a[1]='b'; a[2]='c'; a[3]='\0'; printf("%s\n",a ); ~~~ ~~~ char a[10]="hello"; a[3]=0; //对于字符串来讲是hel,因为0结尾,0就是\0的ascii码 但是对于数组来说成员数量没有发生变化 ~~~ 一个char数组中可以有多个0,字符串只能一个 **scanf录制到char数组** ~~~ int main() { char arr[100]; //scanf默认遇到空格会结束,这样的意思是遇到\n才结束 scanf("%[^\n]", arr); printf("%s\n", arr); system("pause"); return EXIT_SUCCESS; } ~~~ ## 查看数组内存结构 ~~~ int main() { //数组内存结构 int scores[5] = { 99 ,10, 11, 15, 9}; printf("%p\n", &scores[0]); system("pause"); return EXIT_SUCCESS; } ~~~ 在system那设置断点 然后调试,会出现个内存地址,复制那地址,不要结束调试 然后在调试->窗口->内存->选择一个 把你刚才出现的内存地址复制到那 ![](https://box.kancloud.cn/089b1ee117f56a12976d05f29a176a53_642x310.png) int是四个字节,上面结果是16进制,涉及到内存大小端对齐,看的时候是从后到前 我们打开计算器 ![](https://box.kancloud.cn/7ba8655f455b7fc6d74a7c409e79f95a_1570x1294.png) 可以看到63的十六进制是99