- 2.3 二维数组的使用
二维数组的使用也是通过下标的方式。
看代码
#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;//每一行,每一列开始放数 //按顺序放从0开始 } } for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 4; j++) { printf("%d ", arr[i][j]); } } return 0; }
上面的代码中我们从0开始一直输到11存放在数组里,再按顺序输出
- 2.4 二维数组在内存中的存储
像一维数组一样,这里我们尝试打印二维数组的每个元素。
#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; }
我们可以看到数组也是连续存放的,二维数组的每一个元素前后也是相差四个字节,当然这和int有关,也可以看到可以使用下标对数组进行访问,且一维数组和二维数组的下标都是从0开始的
数组越界
数组的下标是有范围限制的。
数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,
所以程序员写代码时,最好自己做好检查
#include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int i = 0; for(i=0; i<=10; i++) { printf("%d\n", arr[i]);//当i等于10的时候,越界访问了 } return 0; }
因为数组下标是从0开始的,0-9刚刚好十个数,当下标为10的时候是第11个数,所以越界了
下面我们要讲一个冒泡排序,但是在讲之前我们先要了解一个东西就是数组名
3 数组名是什么??
我们看下面的一个代码
#include <stdio.h> int main() { int arr[10] = {1,2,3,4,5}; printf("%p\n", arr); printf("%p\n", &arr[0]); printf("%d\n", *arr); //输出结果 return 0; }
*是解引用操作符,相当于取出内容,可以这样理解,他和&这个符号刚刚好相反,这里在操作符中我会解释
结论:数组名是首元素的地址,但是也有两个例子不是,两个都是操作符,一个是sizeof,另一个是&
可以看出sizeof求出的字节大小还是整个数组的大小
但是大家可能觉得取地址不也是取得第一个字符的地址吗,下面我们这样写的可以看出来了
#include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; printf("%p\n", arr); printf("%p\n", arr+1); printf("%p\n", &arr); printf("%p\n", &arr+1); return 0; }
这样我们可以看出没有取地址符号加一跳过的是一个整型,但是有(&)符号的跳过的是十个整型,所以&符号是整个地址
4冒泡排序
我们要实现一个从小到大的冒泡排序,首先我们要知道什么是冒泡,冒泡就是比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
#include <stdio.h> void mao_pao(int arr[], int sz) { int i = 0; for (i = 0; i < sz - 1; i++) { int flag = 1; int j = 0; for (j = 0; j < sz - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = 0; } } if (flag)//如果j的那个循环一次也没执行,就退出 { break; } } } int main() { int arr[] = { 10,9,8,7,6,5,4,3,2,1 }; int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; mao_pao(arr, sz); //打印 for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
这个就是一个简单的冒泡排序,排序不只有冒泡,还有选择排序,后面也都会讲
今天的分享就到这里结束,大家是否可以留下个赞支持一下小编,谢谢大家!