目录
1.数组名
&arr[0]; arr; 这两个值的结果是一样的,也就是说都存储着数组首元素的地址 数组名放入sizeof计算时,计算的是整个数组的大小 数组名存的是首地址,至于&arr这样的,是整个数组地址
&arr[0]与&arr[0]+1相差4字节,arr与arr+1也是相差4字节,这是因为他们跳过的是一个元素,而int类型一个元素占4个字节,所以相差4字节。而&arr与&arr+1相差了40字节,是因为这个数组一共有10个元素,一共占了40字节空间,跳过了一个数组。
2.指针访问数组
输入 int *p=arr; for (i=0;i<sz;i++) { scanf("%d",p+i);arr+i也行 } 输出 printf("%d",*(p+i));
本质上arr[1]被编译器转换为*(arr+1);同理,直接用p(i)也能访问数组,也是等同于*(p+i)。
同理,i[arr]本质上也是如此,arr[i]==*(arr+i)==*(i+arr)==i[arr]
3.一维数组传参本质
由于数组名是数组首元素的地址,所以当传参时,传递的是数组首元素的地址,而不是整个数组。
如果传递数组给函数,那么无法在函数内部计算数组的元素个数,sizeof算不出元素个数。
但就算是以指针的形式传参,在函数内部计算时,也只能算出指针变量的大小,比如32位机器4字节。
由此可知,无法在函数内部计算外来数组的元素个数
4.冒泡排序
#include<stdio.h> void mp(int arr[], int sz) { int i = 0; for (i = 0; i < sz-1; i++)//比如10个数字,那么要进行9趟 { int j = 0; for (j = 0; j < sz - i-1 ; j++)//从左往右,两两比对,最大或最小都会放最右边 //那部分不需要再交换了,所以减去i,由于有j+1,所以要再-1,防止越界访问, //如果是<=,就不能-1了,因为必须-2,因为要保证循环只能到倒数第2个数 //(这也有j+1的原因,如果没有j+1,则是最后一个数即可) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } int main() { int arr[] = { 2,1,5,4,3,6,7,9,8 }; int sz = sizeof(arr) / sizeof(arr[0]); mp(arr, sz); int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
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-i-1; j++) { if(arr[j] > arr[j+1]) { flag = 0;//发⽣交换就说明,说明数组目前还不是升序或降序 int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } if(flag == 1)//比如发生了几次交换后,整个数组就已经是升序或降序,那么就没必要继续比对了 //可以直接退出循坏 break; } }
5.二级指针
二级指针 指的是指针变量的地址
*ppa是对ppa存的地址进行解引用,指向了pa的内容,也就是pa存储的地址,但不进行下一步引用,不会指向pa存储的地址代表的变量。
**ppa则不同,先对ppa的存储的地址进行解引用,指向pa的存储的地址,接下再对pa存储的地址解引用,指向了pa存储的地址代表的变量。
6.指针数组
指针数组是存储指针的数组
指针数组的每一个元素都是一个指针,存储着地址。还可以对元素进行解引用。
7. 指针数组模拟二维数组
#include<stdio.h> int main() { int arr1[] = { 1,2,3,4,5 }; int arr2[] = { 2,3,4,5,6 }; int arr3[] = { 3,4,5,6,7 }; int* par[3] = { arr1,arr2,arr3 }; int i = 0; int j = 0; for (i = 0; i < 3; i++) { for (j = 0; j < 5; j++) { printf("%d ", par[i][j]); } printf("\n"); } return 0; }
par是一个指针数组,由于arr数组名存储着数组的首元素地址,所以可以数组存在指针数组中,前提都是int类型。
par[i]==*(par+i)
par[i][j]== *(*(par+i)+j)