1.数组名的理解
我们发现数组名和数组首元素的地址打印出的结果一模一样,数组名就是数组首元素(第一个元素)的地址。
数组名如果是数组首元素的地址,那下面的代码怎么理解呢?
输出的结果是:40,如果arr是数组首元素的地址,那输出应该的应该是4/8才对。
其实数组名就是数组首元素(第一个元素)的地址是对的,但是有两个例外:
sizeof(数组名),sizef中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
&数组名,这里的数组名表示整个数组,取出的是整个数组的地址 (整个数组的地址和数组首元素的地址是有区别的)
除此之外,任何地方使用数组名,数组名都表示首元素的地址。
图解:
2.使用指针访问数组
为什么访问数组的时候可以使用指针呢?
1.数组在内存中是连续存放的
2.指针+-整数运算,方便我们获得每一个元素的地址
int main() { int arr[10] = { 0 }; //使用指针来访问数组 int sz = sizeof(arr) / sizeof(arr[0]); //输入10个值 int* p = arr; int i = 0; for (i = 0; i < sz; i++) { //输入1个值 scanf("%d", p+i);//p+i == &arr[i] } //输出10个值 for (i = 0; i < sz; i++) { printf("%d ", i[arr]);//p[i] arr[i] *(arr+i) } return 0; }
arr[i]==>*(arr+i)等价
1.数组就是数组,是一块连续的空间(数组的大小和数组元素个数和元素类型都有关系)
2.指针(变量)就是指针(变量),是!一个变量(4/8个字节)
数组与指针的联系:
3.数组名是地址,是首元素的地址
4.可是使用指针来访问数组
3.一维数组传参的本质
打印的值为1,是指针变量的大小,不是数组的大小
数组传参的时候,形参是可以写成数组的形式的 但是本质上还是指针变量 void Print(int arr[10])//int* arr { int sz = sizeof(arr) / sizeof(arr[0]);//得不到元素个数的,算出来的是指针变量的大小 int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } } void Print(int* p,int sz) //应该是指针 { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *(p + i)); } } int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]); Print(arr, sz);//arr 数组名就是数组首元素的地址 //sizeof(arr) //&arr return 0; }
1. 数组传参的本质是传递了数组首元素的地址,所以形参访问的数组和实参的数组是同一个数组的。
2.形参的数组是不会单独再创建数组空间的,所以形参的数组是可以省略掉数组大小的。
总结:一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。
4 .冒泡排序
冒泡排序的核心思想:就是两两相邻的元素进行比较。
图示:
代码如下:
升序 void bubble_sort(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 == 1) { break; } } } void print_arr(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } } int main() { int arr[] = { 9,8,7,6,5,4,3,2,1,0 }; //排序 int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz); //打印 print_arr(arr, sz); return 0; }
避免已经排序结束了,但是还在循环
5.二级指针
int main() { int a = 10; int* p = &a;//p就是一级指针 int * * pp = &p; int** * ppp = &pp; int**** pppp = &ppp; //..... return 0; }
解引用
6.指针数组
指针数组是数组还是指针?
是数组!
eg:好孩子,主语是孩子
我们类比一下,整型数组,是存放整型的数组,字符数组是存放字符的数组。
那指针数组呢?是存放指针的数组。
7.指针数组模拟二维数组
并不是真的二维数组,只是模拟出来的
图解:
parr[]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数组中的素。
上述的代码模拟出二维数组的效果,实际上并非完全是二维数组,因为每一行并非是连续的。
希望对你有帮助!加油各位!!
每一次努力都是不凡的历练,每一点进步都是值得庆祝的胜利。你正在创造属于自己的辉煌,相信自己,一切皆有可能。