贵州建设厅网站办事大厅,手机软件app制作工具,wordpress 前端模板,自己做个购物网站文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、二级指针五、指针数组六、指针数组模拟二维数组 前言 不把指针学的扎实#xff0c;可不敢说自己C语言基础学的好 一、数组名的理解
#include stdio.h
int main()
{int arr[10] { 1,2,3,4… 文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、二级指针五、指针数组六、指针数组模拟二维数组 前言 不把指针学的扎实可不敢说自己C语言基础学的好 一、数组名的理解
#include stdio.h
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf(arr[0] %p\n, arr[0]);printf(arr %p\n, arr);return 0;
}输出结果 所以数组名就是数组第一个元素的地址 数组名就是数组⾸元素(第⼀个元素)的地址是对的但是有两个例外 • sizeof(数组名)sizeof中单独放数组名这⾥的数组名表⽰整个数组计算的是整个数组的⼤⼩ 单位是字节 • 数组名这⾥的数组名表⽰整个数组取出的是整个数组的地址整个数组的地址和数组⾸元素的地址是有区别的 除此之外任何地⽅使⽤数组名数组名都表⽰⾸元素的地址。 #include stdio.h
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf(arr[0] %p\n, arr[0]);printf(arr[0]1 %p\n, arr[0] 1);printf(arr %p\n, arr);printf(arr1 %p\n, arr 1);printf(arr %p\n, arr);printf(arr1 %p\n, arr 1);return 0;
}输出结果 arr[0] 0077F820
arr[0]1 0077F824
arr 0077F820
arr1 0077F824
arr 0077F820
arr1 0077F848这⾥我们发现arr[0]和arr[0]1相差4个字节arr和arr1 相差4个字节是因为arr[0] 和 arr 都是 ⾸元素的地址1就是跳过⼀个元素。 但是arr 和 arr1相差40个字节这就是因为arr是数组的地址1 操作是跳过整个数组的。
二、使用指针访问数组
#includestdio.hint main() {int arr[10] { 0 };int sz sizeof(arr) / sizeof(arr[0]);int* p arr;int i 0;for (i 0; i sz; i) {scanf(%d, p i);//也可以写成scanf(%d,arri);}for (i 0; i sz; i) {printf(%d , *(p i));}return 0;
}本质上p[i] 是等价于 *(pi)arr[i] 应该等价于 *(arri) 三、一维数组传参本质
之前我们都是在函数外部求数组的个数那如果在函数内部呢
数组名是数组⾸元素的地址那么在数组传参的时候传递的是数组名也就是说本质上数组传参传递的是数组⾸元素的地址。
所以函数形参的部分理论上应该使⽤指针变量来接收⾸元素的地址。那么在函数内部我们写 sizeof(arr) 计算的是⼀个地址的⼤⼩单位字节⽽不是数组的⼤⼩单位字节。正是因为函 数的参数部分是本质是指针所以在函数内部是没办法求的数组元素个数的。
#includestdio.hvoid test(int arr[]) {printf(%d\n, sizeof(arr));
}void test(int* arr) {printf(%d, sizeof(arr));
}int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,0 };test(arr);return 0;
}⼀维数组传参形参的部分可以写成数组的形式也可以写成指针的形式。 四、二级指针
是变量都有地址
那么指针变量也是变量它的地址在哪呢
存放在二级指针中 *ppa 通过对ppa中的地址进⾏解引⽤这样找到的是 pa *ppa 其实访问的就是 pa int b 20;
*ppa b;//等价于 pa b;**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作 *pa 那找到的是 a . **ppa 30;
//等价于*pa 30;
//等价于a 30;五、指针数组
指针数组是一个数组数组里面每一个元素的类型都是指针类型 数组指针的每个元素是地址⼜可以指向⼀块区域。
六、指针数组模拟二维数组
#includestdio.hint main() {int arr1[5] { 1,2,3,4,5 };int arr2[5] { 2,3,4,5,6 };int arr3[5] { 3,4,5,6,7 };int* parr[3] { arr1,arr2,arr3 };int i 0;int j 0;for (i 0; i 3; i) {for (j 0; j 5; j) {printf(%d , parr[i][j]);//printf(%d, *(*(parr i) j));//parr[i][j] *(*(parr i) j);}printf(\n);}return 0;
}parr[i]是访问parr数组的元素parr[i]找到的数组元素指向了整型⼀维数组parr[i][j]就是整型⼀维数组中的元素。
上述的代码模拟出⼆维数组的效果实际上并⾮完全是⼆维数组因为每⼀⾏并⾮是连续的。