目录
指针定义
指针数组
数组指针
函数指针
typedef
输入输出函数
指针定义
1)直接定义 int *p,*q;
2)typedef int* point_32; point_32 m,n;int a;m=&a;n=&a;
指针数组
1)一个保存指针类型数据的数组
2)
char*arr[2]={"hello","world"};
arr[0]="tulun";
char *p=arr[0];//此处p++为一次加一个字母
char **q=&arr[0];//q++为加一个单元格,即(hello)
数组指针
1)一个指向数组的指针
2)
int brr[3][4];
int(*p)[4];//指向四个格子的指针p(4为一行的四个元素)
p++;//一次加四个元素,一次加四个元素的单元格。
int (*p)[4]=brr;//p++ 一次加4个元素(int整形)brr代表首元素的地址,因此便是二级指针,
指向一行四个元素的指针。
int (*p)[4]=&brr[0];//p++ 一次加4个元素(int整形)brr[0]代表第一行的首地址,加上&便是
二级指针,指向第一行首地址的指针,第一行四个元素,所以定义指针时需要写指向的元素数(4),
int *p=&brr[0][0];//p++加一个整型int 此处是指向brr[0][0]这个元素的指针
int (*p)[3][4]=&brr;//p++一次加12个整型(brr自身便是二维数组的首地址,加上&便是需要
一个三级指针,然后对左边指针的定义时,其中的[][]中的内容便是指针,指向三行四列这个整体的指针)
对数组指针的重命名
typedef int(*arr_print)[4];
arr_print pp=arr;
typedef long long int int_64;//类型名的重命名
函数指针
typedef int(*PFLN)(int,int) int main(){ PLFN t=p; p(a,b) }
int add(int a,int b){
return a+b;
}
int mum(int a,int b){
return a*b;
}
int main(){
int a,b;
char p[10]="0";
scanf("%d%d",&a,&b);
scanf("%c",&arr);
int (*pfun)(int,int)//声明一个指针变量
if(strcmp(arr,"+")==0){
pfun=add;//函数名便是栈开辟的内存的首地址
}
else {
pfun=mun;
}
pfun(a,b);
}
typedef
typedef:类型别名
1)typedef int*point_32; 若定义int *类型的指针。直接用point_32.
2)typedef int** ppoint;若定义int **类型的指针,直接用ppoint定义.
3)typedef int(*parr)[4];若定义二维数组列数为4的数组指针,直接用parr.
4)type voif(*pfun)(int,int); pfun是个函数指针类型.定义直接用pfun定义。
代码举例:
typedef int* Point_32;
typedef int** PPoint;
typedef int(*Parr)[4];
//数组指针 arr + 1
int main() {
int arr[3][4];
/*1 1 1 1
1 1 1 1
1 1 1 1*/
//int(*Parr)[4] = arr; // Parr + 1;
Parr point_arr = arr;
int p;
int *q=&p;<=>point_32 q=&p;
int **m=&q;<=>ppoint m=&q;
}
函数指针的typedef用法 :
无typedef:
void add(int a,int b){ }
void mul(int a,int b){ }
int main(){
void(*pfun)(int ,int );//声明一个函数指针,变量名为pfun
pfun=add;//add 函数名 函数栈地址
pfun=mul;
pfun(1,2);//调用函数取决于函数指针的指向函数,即pfun指向的函数(mul)
}
typedef:
typedef void (*point)(int ,int);
void add(int a,int b){ }
void mul(int a,int b){ }
int main(){
point pfun=add;
pfun(1,2);
pfun=mul;
pfun(1,2);
}
输入输出函数
该问题我用一段代码来给大家展示以下问题所在
int add(int a,int b){
return a+b;
}
int mum(int a,int b){
return a*b;
}
int main(){
int a,b;
char p;
scanf("%d%d",&a,&b);
scanf("%c",&p);
int (*pfun)(int,int)
if(strcmp(p=='+'){
pfun=add;
}
else {
pfun=mun;
}
pfun(a,b);
}
若运行此代码就会发现输入了a,b之后没有输入字符p便会自动运行代码,原因是这样
scanf 输入会有一个缓冲区,一般会由换行或者空格键进行分割确定缓冲区的结束,然而在先输入整型,紧接着输入字符时,系统会无法判断你输入完整型之后的换行是缓冲区结束还是你输入的下一个字符,因此会直接运行程序,不会让你输入字符p,要想代码正常运行,只需要在输出整形数字之后加getchar()语句,该语句为输入字符语句,代替了换行的位置,因此可以正常输入。
字符 char c=getchar(),putchar(c)
字符串 gets(); puts();
均可输入输出:scanf() ; printf();