二维数组如何通过一维行指针使用,以及指针变量如何让进行赋值?

问题描述:
1.

p=*(p_row+1);         //使p指向下一行

(1)此处的指针函数传过来的数值为二维数组的第i个行指针数组,一共就一行,为什么此处是指向下一行?
(2)这一句赋值语句是int * 类型赋值给了 *类型吗,即把数值赋给了地址?(好像有一种情况是指针数组在某种情况下可以当作数组使用?)
2.

if(*(*p_row+i)<60)

p_row指的是第一个元素的位置,当i=0时,指的就是第一个元素的位置,* (p_row+1)指的是第一个元素的值,那在第一个元素的值的基础上再加一个 * 是指的什么?
代码目的:
某数理化三项竞赛训练组有3个人,找出其中至少有一项成绩不合格者。要求使用指针函数实现
//完整代码

 #include <stdio.h>
int *seek(int (*p_row)[3])
{
     int i=0,*p;
     p=*(p_row+1);                //使p指向下一行
     for(;i<3;i++)
     {
          if(*(*p_row+i)<60)     //某项成绩不合格
           {
                p=*p_row;           //使p指向本行之首
                break; 
           }
     }
     return p;
}
void main()
{
      static int grade[3][3]={{55,65,75},{65,75,85},{75,80,90}};
      int i,j,*pointer;               //定义一个列指针变量
      for(i=0;i<3;i++)
     {
          pointer=seek(grade+i);
          if(pointer==*(grade+i))
          {
                printf("No.%d grade list: ",i+1);
                for(j=0;j<3;j++)
                     printf("%d ",*(pointer+j));
                printf("\n");
          }
     }
}

万分感谢!

  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    问题1. 为什么指针函数传递的参数会指向下一行?

    这个问题可能与指针的运算有关。在C语言中,指针是一个变量,用来存储内存地址。指针运算可以通过加法或减法来改变指针的值。对于一个二维数组,每一行都是一个独立的一维数组。当你传递一个指向第i行的指针数组时,对指针进行加法操作时,指针会自动增加到下一行的起始位置,这就导致了指向了下一行。

    例如,假设有一个二维数组arr,假设每一行有5个元素,arr[i]代表第i行的地址,那么arr[i+1]代表着下一行的地址。在函数中,传递的arr[i]就是指向某个行的起始位置的指针,当你对指针进行加法操作时,指针就会指向下一行的起始位置。

    问题2. int 类型的值赋给了类型,这是将数值赋给了地址吗?

    在C语言中,类型是用来表示指针类型的,int 表示指向int类型的指针。当你将int 类型的值赋给类型时,实际上是将指针所指向的地址对应的值赋给了*类型。

    例如,假设有一个指针ptr指向一个int类型的变量,通过ptr就可以访问这个变量的值。当你将另外一个int 类型的指针赋值给ptr时,实际上是将赋值指针所指向的变量的值赋给了ptr。

    指针数组可以像普通数组一样使用。指针数组是一个数组,里面存储了多个指针。

    下面是一个示例代码,展示了如何使用指针函数来找出在某个数理化三项竞赛训练组中成绩不合格的人:

    #include <stdio.h>
    
    int main() {
        int scores[3][3] = {{90, 80, 70}, {85, 75, 65}, {95, 60, 55}};
        int *ptr[3];
    
        // 将每一行的指针放入指针数组中
        for (int i = 0; i < 3; i++) {
            ptr[i] = scores[i];
        }
    
        // 指向某行的指针函数
        int *getRowPointer(int *ptr[]) {
            return ptr[0];
        }
    
        // 输出每一行的第一个元素
        for (int i = 0; i < 3; i++) {
            printf("第%d行的第一个元素: %d\n", i+1, getRowPointer(ptr)[i]);
        }
    
        // 查找不合格的人
        for (int i = 0; i < 3; i++) {
            int *row = getRowPointer(ptr) + i; // 获取指针数组中第i个指针所指向的行的起始位置
            int sum = 0;
            for (int j = 1; j < 3; j++) {
                sum += *(row + j); // 通过指针访问第i行的第j列的成绩
            }
            if (sum < 180) {
                printf("第%d行的成绩不合格\n", i+1);
            }
        }
    
        return 0;
    }
    

    在这个示例代码中,首先定义了一个二维数组scores,表示每个人的成绩。然后定义了一个指针数组ptr,用来存储每一行的指针。通过将每一行的指针放入指针数组中,就可以通过指针数组来访问每一行的元素。

    然后定义了一个名为getRowPointer的指针函数,用来返回指针数组中某一行的指针。在这个函数中,ptr[0]代表指针数组的第一行,通过返回它,就可以获取到某一行的指针。

    接下来,通过循环遍历指针数组,使用getRowPointer函数获取每一行的指针,然后对每一行的成绩进行计算,判断是否达到不合格的标准。

    希望能对你的问题有所帮助!如果还有其他问题,请随时提问。

类型修正:在C语言中, void main() 应该修改为 int main() ,main()函数应该返回一个整数值。
头文件添加:程序中使用了 printf 函数,需要引入头文件 stdio.h ,在代码的开头添加 #include <stdio.h> 。
函数声明:在 seek() 函数的前面,需要添加函数的声明,将 int *seek(int (*p_row)[3]); 加入 main() 函数前。
函数实现:将 seek() 函数的实现放在 main() 函数后面,避免函数未定义的错误。
主函数返回值:在 main() 函数中,添加 return 0; 语句表示程序正常结束