广州软件网站开发,网页设计实训目的,企业信息查询系统官网广东,南京网站推广排名前十目录
一、数组名的理解
二、使用指针访问一维数组中的每个元素
三、一维数组传参的本质
四、冒泡排序
五、二级指针
六、指针数组
七、指针数组模拟二维数组 一、数组名的理解 1. 一般情况下#xff0c;数组名就是数组首元素的地址。 2. 特殊情况1#xff1a;sizeof(数…目录
一、数组名的理解
二、使用指针访问一维数组中的每个元素
三、一维数组传参的本质
四、冒泡排序
五、二级指针
六、指针数组
七、指针数组模拟二维数组 一、数组名的理解 1. 一般情况下数组名就是数组首元素的地址。 2. 特殊情况1sizeof(数组名)这里的数组名指的是整个数组sizeof计算的结果也将是整个数组的大小。 3. 特殊情况2数组名这里取到的地址是整个数组的地址。 4. 数组首元素的地址和数组的地址两者的区别指针变量进行-整数操作时向前向后一步移动的距离是有差异的例如下图代码arr arr[0] ! arr当arr和arr的地址同时进行1操作时arr的地址移动的是4个字节而arr的地址移动的是40个字节。 0x....A4 - 0x....CC 10*1641 - 12*1612*1 -40。 5. 注意不要混淆数组名一般情况下是数组首元素的地址函数名是函数的地址而变量名不能理解成变量的地址它仅仅代表变量本身而已。 二、使用指针访问一维数组中的每个元素 1. 请注意指针变量本身就是地址p arr。如果想直接使用拿到的地址也可以不进行把地址存入指针变量的操作直接将地址当作指针变量进行解引用、- 整数操作也行。 2. arr[i] 的不同写法理解....... ① arr[i] 本质是 *(arri)通过数组首元素地址偏移并解引用地址即可找到数组中的每一位元素。 ② [i]arr 是 *(arri) 交换律的产物即 [i]arr 的本质是 *(iarr)不过很少在代码中如此表达。 3. 总之当我们想要访问一个数组每个元素时可以利用数组首元素地址arr或存有数组首元素地址的指针p [i]表示利用数组首元素地址偏移并解引用找到地址所指向的变量arr[i] p[i]或写成 i[arr]i[arr]也可以写成这种形式 *(arri)*(pi) 。 //使用指针访问一维数组中的每个元素
int main()
{int arr[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int sz sizeof(arr) / sizeof(arr[0]);int* p arr;//数组名是数组首元素的地址地址所指向的变量是int类型int i 0;//循环变量for (i 0; i sz; i){//一边输入一边输出scanf(%d, p i);printf(%d , *(p i));//利用地址偏移并解引用地址找到指针所指向的数组元素//写法二利用地址直接代替指针//scanf(%d, arr i);//printf(%d , *(arr i));//写法三arr与i实行交换律的产物//scanf(%d, p i); //arr[i]*(p i)*(arr i)//printf(%d , i[arr]); //*(arr i)*(i arr)i[arr]//即arr[i]本质是*(arri)//即[i]arr本质是*(iarr)}return 0;
}
三、一维数组传参的本质 1. 一维数组传参本质上传递的是数组⾸元素的地址而不是整个数组也不是整个数组的地址。 2. 数组的大小只能在自己所被创建的函数中求所以我们常常把数组的大小作为一个函数的参数一起传给自定义函数。 test(arr, sz);//sz是数组arr的大小 3. ⼀维数组传参形参的部分的两种写法① 直接写成数组的形式②写成指针变量的形式但这两种写法形参的本质都是数组首元素地址只是有不同写法而已。 void test(int arr[ ]); void test(int* p); 4. 注意理解一维数组传参属于传址调用。 //在函数内部求数组的大小
//结论数组传参本质上传递的是数组⾸元素的地址而不是整个数组
// 数组的大小只能在自己所被创建的函数中求void test(int arr[])//现在的arr是存有数组首元素地址的指针x86下指针的大小是4字节
{int sz2 sizeof(arr) / sizeof(arr[2]);//这里的arr[i]*(arri)表示一个整型变量//大小为4字节printf(sz2%d\n, sz2);//打印1
}int main()
{int arr[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int sz1 sizeof(arr) / sizeof(arr[0]);printf(sz1%d\n, sz1);//打印10test(arr);//掉用test函数求arr的大小return 0;
}
//用函数调用的方式打印一维数组中的内容//形参写法一:
void Print(int* p, int sz)
{int i 0;for (i 0; i sz; i){printf(%d , *(p i));}
}形参写法二
//void Print(int arr[], int sz)
//{
// int i 0;
// for (i 0; i sz; i)
// {
// printf(%d , arr[i]);
// }
//}int main()
{int arr[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int sz sizeof(arr) / sizeof(arr[0]);Print(arr, sz);//将一维数组首元素的地址和数组的大小一并传给了Print函数return 0;
}
四、冒泡排序 1. 排序的趟数元素个数-1。 2. 每趟排序结束后下一趟最高的数组下标要在现有基础上-1。 3. 在开始冒泡排序前利用flag1假设原本数组的排序就是最终想要的序列如果一旦在第一趟冒泡排序中程序没有进入到交换阶段那么这个序列一定就是最终想要的序列否则就继续正常进行冒泡排序。 void Bubble_sort(int arr[], int sz)
{int flag 1;int i 0, j 0;for (i 0; i sz - 1; i){for (j 0; j sz - i; j)//趟数元素个数-1{if (arr[j] arr[j 1]){flag 0;int tmp arr[j];arr[j] arr[j 1];arr[j 1] tmp;}}if (flag){break;}}
}void Print(int arr[], int sz)
{int i 0;for (i 0; i sz; i){printf(%d , arr[i]);}
}int main()
{int arr[] { 1, 2, 3, 4, 5, 6 ,7 ,8 ,9 ,10 };int sz sizeof(arr) / sizeof(arr[0]);Bubble_sort(arr, sz);Print(arr, sz);return 0;
}
五、二级指针 1. 二级指针就是存放指针变量地址的指针变量。 2. 对二级指针两次解引用就可以找到其对应一级指针所指向的变量。 int main()
{int n 0;int* p n;int** p2 p;//二级指针第二颗*表示p2是一个指针变量int*表示所指向的变量类型**p2 20;//*p2p, 而*pn所以**p2nprintf(%d\n, n);//打印20return 0;
}
六、指针数组 1. 指针数组就是存放指针的数组数组中的每个元素都是指针(地址)。 2. 指针数组的类型是由数组中每个指针的类型决定的。 int main()
{int arr1[] { 1, 2, 3 };int arr2[] { 2, 3, 4 };int arr3[] { 3, 4, 5 };int* arr[3] { arr1, arr2, arr3 };//指针数组//由于数组名是数组首元素的地址每个数组首元素的地址又是int*类型的//所以arr指针数组的类型是int*[3]return 0;
}
七、指针数组模拟二维数组 1. 模拟的⼆维数组并⾮完全是⼆维数组因为每⼀⾏的数据在内存中是⾮是连续的。 2. 下图代码的解释parr是数组首元素的地址而parr首元素的地址是数组arr1的地址我们可以通过对parr-整数拿到parr中每个元素的地址即内部每个数组的地址再通过对这些地址解引用拿到每个内部数组首元素地址最后通过首元素的地址偏移和解引用找到parr内部数组中的每个元素即有了 *(*(arri) j) parr[i][j] 。 int main()
{int arr1[] {1,2,3,4,5};int arr2[] {2,3,4,5,6};int arr3[] {3,4,5,6,7};int* parr[3] {arr1, arr2, arr3};int i 0;int j 0;for(i0; i3; i){for(j0; j5; j){printf(%d , parr[i][j]);}printf(\n);}return 0;
}