#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;
}
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;
}