ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C语言指针与数组深度解析2(详细易理解)

C语言指针与数组深度解析2(详细易理解) 浮世尘弦个人主页⭐个人专栏《C语言》、《数据结构与算法》、《C》非淡薄无以明志非宁静无以致远文章目录一深入理解数组名二使用指针访问数组三一维数组传参的本质四冒泡排序五二级指针六指针数组七字符指针变量八数组指针变量1定义2表示3数组指针的初始化九二维数组传参的本质1剖析二维数组2运用展示十函数指针变量十一关键字typedef1,typedef的定义和运用2,typedef和define的区别十二函数指针数组1定义2运用十三转移表一深入理解数组名1引出问题通过上述代码可知arr确实是首元素的地址但是在sizeof中的arr又表示出了40个字节这就又表示arr代表的是整个数组产生了矛盾。结论说数组名就是地址是正确的。不过有两个例外1.sizeof(arr)此时arr表示的是整个数组的大小2arr,此时代表的是arr整个数组的地址通过下面的分析由上图可知arr和arr[0]都代表着数组首元素的地址所以他们加1时地址改变一个整型变量的大小 但是arr表示的是整个数组的地址所以在加1时直接跳过了40个字节一个整型占4个字节。只是由于会选取最小的一个进行表示故arr可以表示首元素的地址。二使用指针访问数组由arr[i] *(arri)得*iarr)i[arr] 注意i[arr]也可以但是不建议使用因为会影响代码的可读性。总结1数组就是数组是一块连续的空间大小取决于数组内元素的个数和元素的类型2指针(变量)就是指针(变量)是一个变量大小为4/8个字节3数组名是地址是首元素的地址。4,可以使用指针来访问数组。三一维数组传参的本质总结1数组传参时传入的是首元素的地址产生了传址调用因此形参和实参是同一个数组不会创建新的地址。2形参的数组是不会再创建地址空间的所以形参的数组是可以忽略掉数组的大小写成arr[ ]3一维数组传参时形参可以写成数组形式也可以写成指针形式。四冒泡排序冒泡排序的核心思想是对相邻两个元素进行比较,然后进行排序。分析对一个数组内的元素进行排序例如数组内元素为 10 9 8 7 6 5 4 3 2 1按照升序的方式排列1 2 3 4 5 6 7 8 9 10我们需要先选取10和9两个元素进行比较在交换两个元素的位置依次往下进行当遍历完数组内所有元素后变为9 8 7 6 5 4 3 2 1 10。接着我们需要重复上述过程总共进行遍历9次得到升序数组。代码实现五二级指针二级指针就是指针变量的地址结果为0 //**pp两次解引用为a *pp一次解引用为pint*表示pp指向对象的类型*表示pp为一个指针变量p1跳过4个字节取决于p的类型pp1跳过4或8个字节取决于是x64还是x86)在确定环境下指针的大小是不变的。六指针数组指针数组的本质是数组数组内的元素为指针变量。运用七字符指针变量两种字符指针1接收数组内容可变。2接收常量字符串内容不可变。打印结果wbcdefwbcdefabcdef补充char* ps abcdef可更改为const char* ps abcdef,这样出现*ps更改时可以直接拦截,并在编译器中报错。例题输出结果not samesame分析srt1和str2是创建的两个不同的数组虽然内容一样但是首元素的地址不一样同时两个都可以进行更改故不相同。首先arr1和arr2表示的是首元素的地址arr1和arr2指向的是同一个字符串常量这个常量字符串被储存在一个地址中不可更改。故相同。八数组指针变量1定义类比整形指针变量int* print:指针存放的地址是整型变量的地址能够指向数据。数组指针变量本质上是一种指针存放的是数组的地址不是数组首元素的地址能够指向数组。2表示int* p1[10] //指针数组本质上是数组数组内存放的是地址int (*p2)[10] //数组指针本质上是指针理解由于的优先级比[]高使得*和p2进行结合。故*p2可以表示指针去掉*p2)剩下的部分int表示指针指向的是一个整形数组类型[10]数组内储存的元素的个数为103数组指针的初始化int *p2) [10] arr; //arr可以表示整个数组的地址。九二维数组传参的本质1剖析二维数组二维数组可以看成每个元素都是一个一维数组的数组。换一种解读arr[3][5]前面的arr[i]表示的是数组的每一行后面的[5]表示的是每一行一维数组中的各个元素。可以把每一行当作数组中的每一个元素我们知道数组在传参时传入的是首元素的地址又因为二维数组的首元素是一个数组所以要接收它就要用到数组指针变量int (*p)[10]。2运用展示分析形参可以传二维数组arr[3][5]也可以传数组指针int(*p1)[5]本质上都是数组首元素的地址即第一行的地址。十函数指针变量1函数的地址函数是有地址的函数名就是函数的地址其次函数名这种形式也可以表示函数的地址。如果想要将函数的地址存储起来并运用的话就要创建一个指针来接收它这个指针就是函数指针变量。类比数组指针引出函数指针数组指针int (*p1)[10]函数指针 int (*p2)(int x,int y) add分析p2中存放的是函数的地址 int表示函数的返回类型int x,int y)表示函数的参数可省略为int,int).add表示函数的地址可省略为add.2运用分析ps和*ps)都可以表示地址分析复杂调用12十一关键字typedef1,typedef的定义和运用typedef的作用是用来重命名的可以将复杂的类型进行简化。展示2,typedef和define的区别typedef int* nrt#define NRT_T int*nrt p1,p2p1和p2都是指针变量NRT_T p3,p4p3是指针变量p4是整型变量原因替换后 int*p3 p4 故只有p3是指针变量十二函数指针数组1定义把一个函数的地址放到数组中这个数组就叫做函数指针数组。语法int (*parr[4])(int,int) {add,,sub,mul,div};parr[4]表示数组parr是数组名[4]是数组的个数。int(*)(int,int)表示是函数指针类型。{}内的是同类型的不同的函数名。2运用十三转移表模拟实现计算机主调函数分析让arr[5]数组的首元素为0第一可以使得arr[input]中的input和数组进行正确匹配。二是可以补充输入0的情况。中间调用函数回调函数回调函数就是通过函数指针调用的函数。把一个函数的指针作为参数传递给另一个函数另一个函数在使用这个指针时所调用的函数就是回调函数。主调函数把函数的指针传给中间调用函数中间调用函数利用函数指针找到回调函数对回调函数进行操作再返回内容到主调函数中。转移表通过函数指针的方式实现了对不同函数相似操作降低了函数一个一个进行相似操作而带来的代码冗余节省了空间。
返回列表