iOS开发系列----C语言(指针及递归函数)
指针及递归函数概述
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; }
下一篇: 做好SEO优化高质量内容的11个要点