二级好题集(持续更新)

25.3.2

关于最大元素的读取

  • 请记住,不要直接硬生生地把这些数字带进去算,要读懂数字代表的什么

  • 比如这道题,**就需要你去把这个函数在干什么读懂:**这个函数是一个关于对数组最大值的选择的函数。

  • 技巧:注意观察:

    • 变量增加的先后关系。比如:
    • 该函数p值首先增加,增加后,若是索引k的值没有比索引p的值更大,那么索引k讲变为索引p,注意这里的变化关系!
    • 即变量变化的先后顺序,先进行比较,后值发生改变。
    • 另外,*为什么这里么可以让p直接赋值给初始化后的指针P呢,不应该是把p的地址给p吗,比如:k = &p 解答如下:
    • &k 是取 main 函数中变量 k 的地址,传递给 fun 函数中的 k 。这就使得 fun 函数中的指针 k 指向了 main 函数中的变量 k ,也就是说,fun 函数中的 *kmain 函数中的 k 代表同一块内存空间,对 *k 的操作等同于对 main 函数中 k 的操作。

    • fun 函数的 for 循环初始化部分 for( p=0, *k=p; p<t; p++ ) 中:

      • p 是一个普通的整型变量,在循环初始化时被赋值为 0
      • *k 表示的是指针 k 所指向的内存单元中的值 。由于前面函数调用时 fun 函数的指针 k 指向了 main 函数中的变量 k,所以 *k 其实就是 main 函数中的 k 这个变量。
      • *k = p 这一步,就是把整型变量 p 的值赋给 main 函数中的 k 变量 。因为 p*k(即 main 函数中的 k )都是整型,所以可以直接进行赋值,而不是把 p 的地址赋值过去。

      如果写成 *k = &p&p 得到的是 p 这个变量在内存中的地址,属于 int * 类型,而 *k 是整型变量,两者类型不匹配,这样的赋值在 C 语言中是不允许的。