指针及递归函数概述
1.认识指针
【地址】内存每个字节都有一个数字的编号,称为地址。
【指针】指针是一个变量,用来装地址。
【注】指针是地址变量,地址是指针常量
2.指针的作用
①同一个栈内的数据处理,使用指针没有意义;
②指针就是用来访问栈外面的空间;
③指针就是用来跨栈的
3.空指针和野指针
【空指针】值为0的指针(NULL)
【野指针】指针的值未知,或者说指向了未知的地方
【泛型指针】void *p
4.函数的递归调用
调用自身的函数,称为递归函数,调用自身的行为称为递归调用 【注】函数的递归调用只能用于静态的数据运算,如果是动态数据,风险过高,容易崩溃。
方法
①首先确定临界值,即无需计算,获得的值;
②找这一次和上一次的关系;
③假设当前函数已经可以使用,调用自身计算上一次的运行结果,再写出这次的运行结果
指针及递归函数讲解
1.递归函数
//栈空间溢出
int func(int n) {
if (n == 1) {
return 1;
}
return func(n - 1) + n;
}
//任何函数都可以调用任何函数
int main(int argc, const char * argv[]) {
printf("%d",func(4));
return 0;
}
2.认识指针
当一个指针p,装了变量a的地址,称为p指向了a。
//取变量的地址,取的是变量的首地址。
int a = 5;
int *p = &a;
*p = a;
【注】p:根据p里面存的地址,找到这个地址,取这个类型的大小,它是一个运算,相当于&a,找到地址为&a的那个字节,取*p个字节,得到一个变量,就是a。举个例子:p就相当于天猫,a是我们,p=&a是填写物流地址的过程,*p就是送货,整个过程为注册—邮寄地址—送货的过程
int main(int argc, const char * argv[]) {
//声明整型变量a,存储数字5,用相应指针指向a,通过指针,将a修改成6.
int a = 5;
int * p;
//用相应指针指向a
p = &a;
// 通过指针,将a修改成6.
*p = 6;
printf("a=%d\n",a);
return 0;
}
2.指针的加法运算: 指针+1,加一个*p的字节数,加一个p指向变量的字节数
int main(int argc, const char * argv[]) {
char c;
int a;
int *p = &a;
//p+1与p相比增加了4字节
printf("%p\n",p);
printf("%p\n",p+1);
//q+1比q增加了一个字节
char *q = &c;
printf("%p\n",q);
printf("%p\n",q+1);
return 0;
}
3.指针与数组:数组是指针的常量,指针是数组的变量
int main(int argc, const char * argv[]) {
int a[5] = {1,3,5,7,10};
//数组名是数组首元素地址
int * p = &a[0];
printf("p = %p\n",p);
printf("p+1 = %p\n",p+1);
//取到首元素
*p = a[0];
printf("*p = %d\n",*p);
printf("*(p+1)=%d\n",*(p+1));
printf("*p+1=%d",*p+1);
//指针+1,加的是一个*p所指向类型的字节大小
*(p+1) = a[1];
//数组名是数组首元素地址
p = a;
return 0;
}
小练习
编写函数,将两个整型变量的和,赋给第一个变量,差赋给第二个变量。
参考答案(一万个读者有一万个哈姆雷特,一万个程序员有一万种编码风格,答案仅供参考)
编写函数,将两个整型变量的和,赋给第一个变量,差赋给第二个变量。
void entrust(int * a,int * b) {
int c = *a;
*a = *a + *b;
*b = c - *b;
}
int main(int argc, const char * argv[]) {
int p = 5;
int q = 2;
entrust(&p, &q);
return 0;
}