C语言:二维数组与指针

C/C++
291
0
0
2022-12-01
#include<stdio.h> 
int main(){
    int a[3][4]={{1,2,3,4},{4,3,2,1},{5,6,7,8}};
    //a指向首行元素
    int b[3]={1,2,3};//指向一个元素
    printf("%d\n",a);//指向首行元素的地址
    printf("%d\n",a+1);//指向第二行元素的地址
    printf("%d\n",*(a+0)+0);//指向行为0列为0的地址
    printf("%d\n",*(a+0)+1);//指向行为0列为1的地址
    printf("%d\n",a[0]+0);//指向行为0列为0的地址 
    printf("%d\n",a[0]+1);//指向行为0列为1的地址
    printf("%d\n",&a[0][1]);//指向行为0列为1的地址
    printf("%d\n",*(*(a+0)+1));//指向行为0列为1的值
    printf("%d\n",a[0][1]);//指向行为0列为1的值
    printf("%d\n",*(a[0]+1));//指向行为0列为1的值
    return 0; 
}

img

int (*p)[4];表示定义了一个指针p,这个指针指向一行元素。这一行有4个元素。这指针p是指向一行有4个元素的指针。

#include<stdio.h> 
int main(){
    int a[3][4]={{1,2,3,4},{4,3,2,1},{5,6,7,8}};
    int (*p)[4];
    p=a;
    for(int i=0;i<=2;i++){
        for(int j=0;j<=3;j++){
            printf("%d",*(*(p+i)+j)); 
        }
        printf("\n");
    }
    return 0; 
}

指向函数的指针

函数的名称表示一个函数在内存中的起始地址,函数名称就是函数的指针(地址),所以可以定义一个指向函数的指针变量,用来存放某一个函数的起始地址。

指向函数的指针一般形式:

类型名 (*指针变量)(函数的参数列表)

例如:

#include<stdio.h> 
int add(int a,int b);
int max(int a,int b);
int main(){
    int(*p)(int,int);
    p=add;
    int a=(*p)(4,5);
    printf("%d\n",a);
    p=max;
    a=(*p)(4,5);
    printf("%d\n",a);
    return 0;
}
int add(int a,int b){
    return a+b;
}
int max(int a,int b){
    return a>b?a:b;
}

返回值为指针的函数

一个返回值为指针(地址)的函数,称为返回指针值的函数。

一般形式:类型名 *函数名(参数列表)

例如:有3个学生,每个学生有4门课程,要求用户输入学生的序号,输出该学生的所有课程成绩。

#include<stdio.h> 
int main(){
    int *search(int(*p)[4],int n);
    int a[3][4]={{1,2,3,4},{4,3,2,1},{5,6,7,8}};
    int *p;
    p=search(a,1);//第二个学生 
    for(int i=0;i<=3;i++){
        printf("%d",*(p+i));
    }
    return 0;
}
int *search(int (*p)[4],int n){//第n个学生的分数  
    int *pt;
    pt=*(p+n);
    return pt; 
}