网站免费软件推荐,网页设计图片平移,襄樊网站建设哪家好,住房和城乡建设部课题网站前言 苦苦等待#xff0c;终于迎来了我们的指针讲解第二期#xff0c;如果有还没有看过上一期的小伙伴#xff0c;那赶紧点击这个链接学习后再来看这篇博客吧。指针基础知识超详细讲解#xff08;C 语言#xff09;#xff08;上#xff09; 如果对学习C语言有兴趣那千万…前言 苦苦等待终于迎来了我们的指针讲解第二期如果有还没有看过上一期的小伙伴那赶紧点击这个链接学习后再来看这篇博客吧。指针基础知识超详细讲解C 语言上 如果对学习C语言有兴趣那千万不要忘记关注本专栏哦。O(∩_∩)O 也关注下博主吧 C语言学习专栏 文章目录 1多级指针2一维数组传参的本质和数组名的含义3指针数组4数组指针5二维数组传参的本质6尾声 上一篇博客我们学习了基本的指针类型指针的加减运算以及野指针的成因和避免野指针的方法。今天这一篇博客我们将进一步学习指针。那么久让我们开始吧 1多级指针
首先让我们写先一个简单的指针变量。 int a 10; int* pa a; 这里的int* 代表pa的数据类型是整形指针。那么这个呢 int* * ppa pa; 我们知道pa存的地址会指向整形变量a所以我们用int类型来定义pa如果我们要吧pa的地址在储存在一个指针变量中那么我们就应该用int * *来定义ppaint *指得意思是ppa存的地址指向的变量的数据类型就是int *类型的之后的 *的意思是指ppa是个指针。 那么这么定义ppa的意思就是ppa是一个储存 数据类型为int 的变量的地址 的指针。 这个就是二级指针。 那我们再定义一个指针。 int * * * pppa ppa; 与上面同理ppa就是一个三级指针两级以上的指针就被我们称为多级指针。 我们知道从pa中取出a我们要解引用 * paa 那么我们要从ppa中取出a就要这样解引用 * * ppa * pa a pppa同理。
2一维数组传参的本质和数组名的含义
假如这里有一个函数它的参数是一个数组我们要如何传递这个参数呢可以看看下面的示范。
#includestdio.h
viod test(int arr[])
{
;
}
int main()
{
int arr[10] {1,2,3,4,5,6,7,8,9,10};
test(arr);
return 0;
}我肯可以看到我们直接将数组名传到函数中了这是个什么原理呢接下来我来为大家介绍数组名的本质。 当arr单独存在时它代表数组首元素的地址我们将arr作为参数传过去实际上是把arr数组的首地址传了过去那么这时候大家会疑惑既然我传过去的是地址为什么我要把参数设置为int arr[ ]呢实际上int arr[ ]等价于int * arr也就是说我们也可以把参数的格式写成int * arr。 但是也有特例的情况比如我们要打印数组大小的时候会写出这样一段代码。 printf(“%zd”,sizeof(arr)); 此时arr也是单独存在的但是这是他并不是数组首元素的地址而是代表整个数组除了这种情况以外数组名单独出现都代表数组首元素的地址。 既然这样arr代表着什么呢我们不妨写下这么一段代码测试一下。
#includestdio.h
int main()
{
int arr[10] {1,2,3,4,5,6,7,8,9,10};
printf(%p %p,arr,arr);
return 0;
}我们会发现两者的地址是一样的难道arr代表首元素的地址么那我们对各自地址1在打印看看。
#includestdio.h
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf(%p %p %p,arr, arr1, arr1);return 0;
}可以看出结果却不一样arr1相较于arr多了4,刚好是一个整形的大小而arr1比起arr缺多了整整40正好是整个数组的大小。对arr1跳过了整个数组的大小。说明arr是整个数组的地址。 既然arr单独出现时代表数组首元素的地址那么我们对arr进行解引用我们就会得到数组的首元素 。 * arr 1 那个对arr1解引用自然就是数组的第二个元素了 *arr1 2 那么我们就会发现 * arr 与 arr[0]与 * arr0是等价的 * arr1与arr[1]是等价的。当我们想通过循环打印整个数组时我们就可以这么写。
for(int i 0;i 9 ;i)
{
printf(%d,*arri);
}3指针数组
指针数组顾名思义是个数组整形数组里面装的是整形字符数组里装的是字符那么指针数组里装的自然就是指针。最基本的整形指针数组是这样定义的数组里的元素是整形指针。 int* arr[10] ;(arr是数组名数组中有十个元素) 我们可以在其中存入整形指针。
4数组指针
数字指针显然它是个指针他储存的是一个数组的地址我们先来定义一个整形数组指针存的是整形数组的地址来做个示范吧。 int arr[2]{1,2}; int * parr[2] arr;([ ]的优先级高于*所以要把*parr用括号()括起来表明parr是指针[2]指该数组指针指向的数组有两个元素) 那么数组指针加减运算会有什么结果呢
int main()
{int arr[4] { 1,2,3,4 };int(*parr)[4] arr;printf(%p %p, parr, parr 1);return 0;
}我们会发现刚好了16正好是arr数组的大小可见对parr1会跳过整个数组的大小。 如果对parr解引用那么我们就会得到数组arr的地址即arr首元素的地址。
5二维数组传参的本质
首先我们可以把二维数组理解为一个一维数组而这个一维数组里面每一个元素都是一个一维数组即二维数组的每一行都是他的一个元素。对arr解引用会得到其第一个元素的地址即第一行的一维数组。对arr1解引用则会得到第二行的一维数组的地址。
我们将二维数组传参是可以有着两种写法。
void test(int(*parr)[2])
void test (int arr[][2])//行数可以不写但是列数必须写这两种写法是完全等价的因为* parr arr [ 0 ] * arr0 **parr arr[0][0]**arr. 对二维数组传参其实传的是二维数组第一行的地址。 **parr11就等价于 arr[1][1]。
6尾声
经过这篇博客想必大家对数组和指针的了解有了进一步的加深认为博主写的不错的千万不要忘记关注博主等待指针讲解下希望大家都能够学好指针指针很重要想着自己的目标再进一步 最终期冲冲冲