一、指针概念
- 指针也就是内存地址,指针变量是用来存放内存地址的变量
- 使用指针存储其他变量地址之前,必须对其进行声明
- 指针变量声明的一般形式为:type *var-name;
- 指针的访问
#include <stdio.h>
int main()
{
int num = 10;
int *p;
p = #
printf("%d\n",p);
printf("%d\n",*p);
return 0;
}
- 通过指针引用数组
#include <stdio.h>
//通过指针引用数组
int main()
{
int num[5] = {1,2,3,4,5};
int i;
int *p;
p = num; //数组名就是指针的首地址
printf("%d\n",*p);
for(i=0;i<5;i++)
{
//printf("address:%d",p++);
//printf("value:%d\n",*(p++));
//printf("value:%d\n",*(p+i));
printf("value:%d\n",*p+i);
}
return 0;
}
- 指针类型:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
void *p/*万能指针*/
二、指针数组
1.定义:
type *var-name[n];
char *p[20];
2.指针数组的访问
#include <stdio.h>
int main()
{
int num[5] = {1,2,3,4,5};
int i;
int *p[5];
for(i=0;i<5;i++)
{
p[i] = &num[i];
printf("addr:%p value:%d\n",p[i],*p[i]);
}
return 0;
}
3.指针数组的类型
int *ip[2]; /* 一个整型的指针数组 */
double *dp[3]; /* 一个 double 型的指针数组 */
float *fp[5]; /* 一个浮点型的指针数组 */
char *ch[2]; /* 一个字符型的指针数组 */
void *p[20]/*万能指针数组*/
三、指针函数
当函数需要返回一个数组咋办
使用指针作为返回值
(指针函数)
函数原型
int *fun(void)
{
…
}
使用
Int *p;
p = fun();
示例:
#include <stdio.h>
#include <string.h>
//当返回是个数组时,只能用指针做返回值
//输入俩个字符串,返回较大的字符串
//指针函数
char *str_long(char *s1,char *s2)
{
if(strlen(s1) > strlen(s2))
{
return s1;
}
else{
return s2;
}
}
int main()
{
// char str1[30] = {"qwe"};
// char str2[30] = {"asddf"};
// char *p;
// p = str_long(str1,str2);
char str1[30],str2[30],*p;
gets(str1);
gets(str2);
p = str_long(str1,str2);
printf("Longer str:%s\n",p); //%s会根据p[0] 地址自动遍历获取对应的值
return 0
}
另一种实现方法
//比较俩个字符串谁大,并返回最大的字符串
//实现方法:指针函数
char *strlong(char *s1,char *s2)
{
if(strlen(s1)>strlen(s2))
{
return s1;
}
else{
return s2;
}
}
void strlong_test()
{
char str1[30];
char str2[30];
char *p;
gets(str1);
gets(str2);
int len1,len2;
len1 = strlen(str1);
len2 = strlen(str2);
p = strlong(str1,str2);
printf("str long is ");
if(len1>len2)
{
for(int i=0;i<len1;i++)
{
printf("%c",*p++);
}
}
else{
for(int i=0;i<len2;i++)
{
printf("%c",*p++);
}
}
}
int main()
{
strlong_test();
return 0;
}
四、函数指针
指向函数的指针(函数指针)
函数返回值类型 (* 指针变量名) (函数参数列表);
参数列表中只需要写函数的参数类型即可
int Func(int x); /*声明一个函数*/
int (*p) (int); /*定义一个函数指针*/
p = Func; /*将Func函数的首地址赋给指针变量p*/
示例代码:
#include <stdio.h>
//指向函数的指针,(函数指针)
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
//定义一个函数指针
int(*p)(int ,int );
int a,b,c;
p = max; //把函数max赋给指针变量p, 使p指向max函数
printf("please enter a and b:");
scanf("%d %d",&a,&b);
c = p(a,b);
printf("a = %d\nb = %d\nmax = %d\n", a, b, c);
return 0;
}
五、函数指针数组
指向函数的指针
函数指针数组定义
int (*fun[10])(int,int);
使用
int my_add(int x, int y)
{return (x+y);}
int my_dec(int x, int y)
{return (x-y);}
fun[0] = my_add;
fun[1] = my_dec;
(*fun[0])(1, 2);
(*fun[1])(10, 2);
示例代码:
#include<stdio.h>
#include<stdlib.h>
//函数指针数组
int add(int a, int b){ return a + b;}
int sub(int a, int b){ return a - b;}
int mul(int a, int b){ return a * b;}
int div(int a, int b){ if (b != 0) return a / b; }
int test(int a,int b,int(*fn)(int,int))
{
return fn(a,b);
}
void test_test()
{
int i=0;
int (*p[])(int a,int b) = {add,sub,mul,div} ; //定义一个函数指针数组
int n = sizeof(p) / sizeof(p[0]);
for(i=0;i<n;i++)
{
printf("%d\n",p[i](4,5));
}
printf("%d",test(4, 5, add));//函数指针作为函数的参数
}